TCP之簡單回傳(二)

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   ar   for   sp   

鑒於TCP之簡單回傳(一)   中所出現的問題,本博文所要採取的一種方法是:

用戶端:先向伺服器傳送一個 int32_t 大小的資料,表示隨後所要發送資料的真實長度; 伺服器:先接收一個int32_t 大小的資料,再接收真實的資料;

本程式中所用到的函數都可以在 TCP之函數封裝 中找到;

server伺服器端具體實現: 

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/stat.h>#include <errno.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#define ERR_EXIT(m)     do {         perror(m);        exit(EXIT_FAILURE);    }while(0)void do_server(int fd);int main(int argc, const char *argv[]){//socket        int listenfd = socket(AF_INET, SOCK_STREAM, 0 );    if( -1 == listenfd)        ERR_EXIT("socket");//地址複用    int on = 1;    if(setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof on) < 0)        ERR_EXIT("setsockopt");//bind    struct sockaddr_in addr;    memset(&addr, 0, sizeof(addr));    addr.sin_family = AF_INET;    addr.sin_port = htons(8888); //主機位元組序轉化為網路位元組序    addr.sin_addr.s_addr = inet_addr("127.0.0.1");//點分十進位轉化成網路位元組序    if( -1 == bind( listenfd, (struct sockaddr*)&addr, sizeof(addr)))        ERR_EXIT("bind");//listen    if( -1 == listen(listenfd,SOMAXCONN ))        ERR_EXIT("listen");    //accept        int peerfd = accept(listenfd, NULL, NULL);//對方的IP&PORT//read&write        do_server(peerfd);//close    close(peerfd);    close(listenfd);    return 0;}void do_server(int  fd){    char recvbuf[1024100] = {0};    int cnt =0;    while(1)    {        int32_t len = recv_int32(fd);//先接收一個表示真是長度的int型資料            int nread = readn(fd, recvbuf, len);//讀取資料        if(nread == -1)//err        {            if(errno == EINTR)                continue;            ERR_EXIT("read");        }else if (nread == 0 || nread < len )//write close        {            printf("close...\n");            exit(EXIT_FAILURE);        }                // ok         printf("count = %d recv size = %d\n",++cnt, nread);        memset(recvbuf, 0, sizeof(recvbuf));    }}
View Code

client用戶端具體實現:

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <errno.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#define ERR_EXIT(m)     do {         perror(m);        exit(EXIT_FAILURE);    }while(0)void do_server(int fd);int main(int argc, const char *argv[]){//socket    int peerfd = socket(AF_INET, SOCK_STREAM,0);    if( -1 == peerfd)        ERR_EXIT("socket");//connect    struct sockaddr_in addr;    addr.sin_family = AF_INET;    addr.sin_port = htons(8888);    addr.sin_addr.s_addr = inet_addr("127.0.0.1");        if( -1 == connect(peerfd,(struct sockaddr*)&addr, sizeof(addr) ))        ERR_EXIT("connect");//read&write    do_server(peerfd);    return 0;}void do_server(int fd){    #define SIZE 1024    char sendbuf[SIZE +1]= {0};    int i ;    for (i = 0; i < SIZE; i++)     {        sendbuf[i]= ‘a‘;        }    int cnt =0;    while(1)    {        int i;        for (i = 0; i < 10; i++)         {            send_int32(fd, SIZE);//先發送一個表示真實長度的int型資料            int nwrite =writen(fd, sendbuf, SIZE);//寫資料            if( nwrite != SIZE)//err                ERR_EXIT("writen");            printf("cout = %d,write %d bytes\n",++cnt, SIZE);        }        nano_sleep(4.5);    }}
View Code


測試結果:

./servercount = 1 recv size = 1024count = 2 recv size = 1024count = 3 recv size = 1024count = 4 recv size = 1024count = 5 recv size = 1024count = 6 recv size = 1024count = 7 recv size = 1024count = 8 recv size = 1024count = 9 recv size = 1024count = 10 recv size = 1024count = 11 recv size = 1024count = 12 recv size = 1024count = 13 recv size = 1024count = 14 recv size = 1024count = 15 recv size = 1024count = 16 recv size = 1024count = 17 recv size = 1024count = 18 recv size = 1024count = 19 recv size = 1024count = 20 recv size = 1024
View Code
./clientcout = 1,write 1024 bytescout = 2,write 1024 bytescout = 3,write 1024 bytescout = 4,write 1024 bytescout = 5,write 1024 bytescout = 6,write 1024 bytescout = 7,write 1024 bytescout = 8,write 1024 bytescout = 9,write 1024 bytescout = 10,write 1024 bytescout = 11,write 1024 bytescout = 12,write 1024 bytescout = 13,write 1024 bytescout = 14,write 1024 bytescout = 15,write 1024 bytescout = 16,write 1024 bytescout = 17,write 1024 bytescout = 18,write 1024 bytescout = 19,write 1024 bytescout = 20,write 1024 bytes
View Code

 

TCP之簡單回傳(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.