色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

實現TCP的C代碼封裝(含代碼)

嵌入式應用開發 ? 來源:嵌入式應用開發 ? 作者:嵌入式應用開發 ? 2022-09-28 16:03 ? 次閱讀
poYBAGMz_0OAD2rQAACgyioMl6c244.png

tcp_socket.h:

#ifndef TCP_SCOKET_H
#define TCP_SCOKET_H

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define MAX_CONNECT_NUM 10

int tcp_init(const char* ip, int port);
int tcp_accept(int sfd);
int tcp_connect(const char* ip, int port);
int tcp_nonblocking_recv(int conn_sockfd, 
                         void *rx_buf, 
                         int buf_len, 
                         int timeval_sec, 
                         int timeval_usec);
int tcp_blocking_recv(int conn_sockfd, void *rx_buf, uint16_t buf_len);
int tcp_send(int conn_sockfd, uint8_t *tx_buf, uint16_t buf_len);
void tcp_close(int sockfd);

#endif

tcp_socket.c:

#include "tcp_socket.h"

int tcp_init(const char* ip, int port)
{
    int optval = 1; 
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd < 0)
    {
        perror("socket");
        return -1;
    }

    /* 解除端口占用 */
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0)
 {
  perror("setsockoptn");
  return -1;
 }

    struct sockaddr_in server_addr;
    bzero(&server_addr, sizeof(struct sockaddr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    if (NULL == ip)
    {
        server_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    }
    else
    {
        server_addr.sin_addr.s_addr = inet_addr(ip); 
    }

    if (bind(server_fd, (struct sockaddr*)&server_addr,sizeof(struct sockaddr)) < 0)
    {
        perror("bind");
        close(server_fd);
        return -1;
    }

    if(listen(server_fd, MAX_CONNECT_NUM) < 0)
    {
        perror("listen");
        close(server_fd);
        return -1;
    }

    return server_fd;
}

int tcp_accept(int server_fd)
{
    struct sockaddr_in client_addr = {0};
    int addrlen = sizeof(struct sockaddr);
    int new_fd = accept(server_fd, (struct sockaddr*) &client_addr, &addrlen);
    if(new_fd < 0)
    {
        perror("accept");
        close(server_fd);
        return -1;
    }
    
    return new_fd;
}

int tcp_connect(const char *ip, int port)
{
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd < 0)
    {
        perror("socket");
        return -1;
    }

    struct sockaddr_in server_addr;
    bzero(&server_addr, sizeof(struct sockaddr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    server_addr.sin_addr.s_addr = inet_addr(ip);

    if (connect(server_fd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr)) < 0)
    {
        perror("connect");
        close(server_fd);
        return -1;
    }

    return server_fd;
}

int tcp_nonblocking_recv(int conn_sockfd, void *rx_buf, int buf_len, int timeval_sec, int timeval_usec)
{
 fd_set readset;
 struct timeval timeout = {0, 0};
 int maxfd = 0;
 int fp0 = 0;
 int recv_bytes = 0;
 int ret = 0;
 
 timeout.tv_sec = timeval_sec;
 timeout.tv_usec = timeval_usec;
 FD_ZERO(&readset);           
 FD_SET(conn_sockfd, &readset);         

 maxfd = conn_sockfd > fp0 ? (conn_sockfd+1) : (fp0+1);    

 ret = select(maxfd, &readset, NULL, NULL, &timeout); 
 if (ret > 0) 
    {
  if (FD_ISSET(conn_sockfd, &readset)) 
        {
   if ((recv_bytes = recv(conn_sockfd, rx_buf, buf_len, MSG_DONTWAIT))== -1) 
            {
    perror("recv");
    return -1;
   }
  }
 } 
    else 
    {
  return -1;
 }
 
 return recv_bytes;
}

int tcp_blocking_recv(int conn_sockfd, void *rx_buf, uint16_t buf_len)
{
    return recv(conn_sockfd, rx_buf, buf_len, 0);
}

int tcp_send(int conn_sockfd, uint8_t *tx_buf, uint16_t buf_len)
{
    return send(conn_sockfd, tx_buf, buf_len, 0);
}

void tcp_close(int sockfd)
{
    close(sockfd);
}

x下面測試代碼:

#include "tcp_socket.h"

int main(int argc, char **argv)
{
    printf("==================tcp server==================n");
    int server_fd = tcp_init(NULL, 4321);
    if (server_fd < 0)
    {
        printf("tcp_init error!n");
        exit(EXIT_FAILURE);
    }

    int client_fd = tcp_accept(server_fd);
    if (client_fd < 0)
    {
        printf("tcp_accept error!n");
        exit(EXIT_FAILURE);
    }

    while (1)
    {
        char buf[128] = {0};
        
        int recv_len = tcp_blocking_recv(client_fd, buf, sizeof(buf));
        if (recv_len <= 0)
        {
            printf("recv error!n");
            tcp_close(client_fd);
            tcp_close(server_fd);
            exit(EXIT_FAILURE);
        }
        printf("recv : %sn", buf);

        int send_len = tcp_send(client_fd, buf, strlen(buf));
        if (send_len <= 0)
        {
            printf("send error!n");
            tcp_close(client_fd);
            tcp_close(server_fd);
            exit(EXIT_FAILURE);  
        }
        else
        {
            printf("send success! send: %s, send_len: %dn", buf, send_len);
        }
    }
    tcp_close(server_fd);

    return 0;
}

tcp_client.c:

#include "tcp_socket.h"

int main(int argc, char **argv)
{
    printf("==================tcp cient==================n");
    if (argc < 3)
    {
        printf("usage:./tcp_client ip portn");
        exit(EXIT_FAILURE);
    }

    char ip_buf[32] = {0};
    int port = 0;

    memcpy(ip_buf, argv[1], strlen(argv[1]));
    port = atoi(argv[2]);

    int server_fd = tcp_connect(ip_buf, port);
    if (server_fd < 0)
    {
        printf("tcp_connect error!n");
        exit(EXIT_FAILURE);
    }

    while (1)
    {
        char buf[128] = {0};
        if (scanf("%s", buf))
        {
            int send_len = tcp_send(server_fd, buf, strlen(buf));
            if (send_len <= 0)
            {
                printf("tcp_send error!n");
                tcp_close(server_fd);
                exit(EXIT_FAILURE);  
            }
            else
            {
                printf("send success! send: %s, send_len: %dn", buf, send_len);
            }

            bzero(buf, sizeof(buf));
            int recv_len = tcp_blocking_recv(server_fd, buf, sizeof(buf));
            if (recv_len <= 0)
            {
                printf("tcp_blocking_recv error!n");
                tcp_close(server_fd);
                exit(EXIT_FAILURE);
            }
            printf("recv : %sn", buf);
        } 
    }

    return 0;
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1353

    瀏覽量

    79055
  • C代碼
    +關注

    關注

    1

    文章

    89

    瀏覽量

    14297
收藏 人收藏

    評論

    相關推薦

    基于MCS-51單片機的點陣屏實現禮花功能(代碼

    電子發燒友網原創:本文是基于MCS-51單片機的點陣屏實現禮花功能(代碼和功能實現圖)
    發表于 08-08 14:07 ?7374次閱讀
    基于MCS-51單片機的點陣屏<b class='flag-5'>實現</b>禮花功能(<b class='flag-5'>含</b>源<b class='flag-5'>代碼</b>)

    TCP 28J60模塊代碼分享!

    C51代碼,控制28J60模塊實現了部分網絡傳輸功能。有點亂。TCP_28J60.zip (430.77 KB )
    發表于 09-18 21:34

    怎么使具體實現代碼不可見實現函數的封裝?

    如何實現函數的封裝,即能讓別人調用,但是看不到具體的實現代碼。舉個例子,一個開源項目,要把代碼公布出去,但是代碼中有些比較敏感的部分不想讓別
    發表于 03-12 22:18

    流水燈電路(源程序代碼)

    流水燈電路(源程序代碼)
    發表于 09-28 12:16 ?2362次閱讀

    嘀聲報警信號輸出試驗(C語言源程序代碼)

    嘀聲報警信號輸出試驗(C語言源程序代碼) 這一課,我們將學習如何控制蜂鳴器的聲音輸出,這一課我們只輸出
    發表于 08-09 10:48 ?3448次閱讀

    一個按鍵控制的10級變速跑馬燈試驗(源程序C語言代碼)

    一個按鍵控制的10級變速跑馬燈試驗(源程序C語言代碼) 在本課中,我們要用一個按鍵來實現
    發表于 08-09 23:20 ?3401次閱讀

    C標準庫源代碼

    標準C語言庫函數代碼,編程是可參考源代碼
    發表于 07-04 17:31 ?21次下載

    卡爾曼濾波簡介及其實現(附C代碼)

    卡爾曼濾波算法介紹,公式實現,后面附有公式的實現代碼。封裝函數。
    發表于 12-17 17:22 ?40次下載

    DSP編程技巧之鏈接匯編代碼C_C++代碼

    在DSP的開發中,常用的算法都可以用C/C++代碼來高效實現。但是對一些特殊寄存器的讀寫,例如某些CPU寄存器的讀寫,因為C/
    發表于 10-18 09:47 ?7次下載
    DSP編程技巧之鏈接匯編<b class='flag-5'>代碼</b>與<b class='flag-5'>C_C</b>++<b class='flag-5'>代碼</b>

    基于單片機AT89C52和DS1302的溫度時間顯示方案代碼程序

    電子發燒友網站提供《基于單片機AT89C52和DS1302的溫度時間顯示方案代碼程序.zip》資料免費下載
    發表于 01-02 11:34 ?17次下載

    4個重要算法C語言實現代碼

    4個重要算法C語言實現代碼
    發表于 06-10 08:00 ?12次下載

    使用C語言實現靜態網頁的代碼免費下載

    本文檔的主要內容詳細介紹的是使用C語言實現靜態網頁的代碼免費下載。
    發表于 11-22 16:20 ?2次下載

    UDP及TCP通信的程序設計和源代碼免費下載

    本文檔的主要內容詳細介紹的是UDP及TCP通信的程序設計和源代碼免費下載。
    發表于 01-08 15:12 ?37次下載
    UDP及<b class='flag-5'>TCP</b>通信的程序設計和源<b class='flag-5'>代碼</b>免費下載

    C語言 | C51實現紅外收發設計(完整源代碼

    C語言 | C51實現紅外收發設計(完整源代碼
    發表于 11-25 15:21 ?47次下載
    <b class='flag-5'>C</b>語言 | <b class='flag-5'>C</b>51<b class='flag-5'>實現</b>紅外收發設計(完整源<b class='flag-5'>代碼</b>)

    在VS上配置MPI教程(代碼

    在VS上配置MPI教程(代碼
    發表于 01-17 11:24 ?1次下載
    主站蜘蛛池模板: 99热国产这里只有精品9九| 亚洲国产精品无码中文在线| 人人草影院| 日韩欧美精品有码在线播放免费 | 黑人强伦姧人妻日韩那庞大的 | 最近中文字幕2019国语4| 日本一本二本三区免费免费高清| 精品人妻伦一二三区久久AAA片| 含羞草免费完整视频在线观看| jazzjazzjazz欧美| 成人小视频免费在线观看| 国产成人久久婷婷精品流白浆| 国产一区二区在线观看免费| 精子射到丝袜上图| 内射白浆一区二区在线观看| 日本特交大片免费观看| 亚洲成人综合在线| 做暖免费观看日本| 国产成人精品自线拍| 久久re视频这里精品09首页| 女教师二十三岁| 午夜勾魂曲| 中文字幕在线观看亚洲视频| 成人小视频免费在线观看| 好男人午夜www视频在线观看| 免费观看男生桶美女私人部位| 色久天| 一个人的HD高清在线观看| va亚洲va天堂va视频在线| 国产一区二区免费在线观看| 免费精品国偷自产在线| 午夜伦yy44880影院| 99er久久国产精品在线| 国产精品在线手机视频| 美女张开让男生桶| 无人视频在线观看免费播放影院| 综合网伊人| 国产午夜久久影院| 欧美性猛交AAA片| 亚洲欧美综合视频| 成在线人免费|