如何发送和接收数据TCP套接字(C / C ++) [英] How to send and receive data socket TCP (C/C++)

查看:491
本文介绍了如何发送和接收数据TCP套接字(C / C ++)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


  

可能重复:结果
  <一href=\"http://stackoverflow.com/questions/666601/what-is-the-correct-way-of-reading-from-a-tcp-socket-in-c-c\">What是从C / C ++?

TCP套接字读取正确的方法

我试图建立一个TCP客户机/服务器。我的问题是,当我尝试从cliente发送的数据我做的一个发送。

但是,当我尝试使用具有特定结构接收到的数据出现在我的问题,我的意思是,前8个字节设定一个日期,接下来的10名,并设置文本的字节未定义的数字(本文以/结尾R / N / R / N)

客户端发送如下:

 字符日期; [8]
CHAR名称[10];
字符味精[4096];的strcpy(味精,12年12月10日); // 8字节
strcat的(味精,凯文火); // 10字节
strcat(msg,\"abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde\\r\
\\r\
\");nbytes_sent =送(袜子,(字符*)味精的sizeof(MSG),0);
的printf(Bytes_sent:%S - &GT;%I \\ N,味精,nbytes_sent);

和服务器尝试从插座分析数据如下:

 字符日期; [8]
CHAR名称[10];
字符*文本;
焦炭BUF [1024];INT I = 0;
对于(i = 0; I&LT; 8;我++)
    日期[I] ='\\ 0';
对于(I = 0; I&小于10;我+ +)
    名称由[i] ='\\ 0';nbytes_read =的recv(sclient,(字符*)日期的sizeof(日期),0);
如果(nbytes_read大于0){
    的printf(日期:%S(%I)\\ n,日期,nbytes_read);
    //cout.flush();
    nbytes_read =的recv(sclient,(字符*)名称,sizeof的(名称),0);
    如果(nbytes_read大于0){
        的printf(名称:%s(%I)\\ n,名称,nbytes_read);
        //cout.flush();
        nbytes_read =的recv(sclient,(字符*)buf中,sizeof的(BUF),0);
        的strcpy(文字,BUF);
        而(nbytes_read大于0){
            nbytes_read =的recv(sclient(字符*)buf中,sizeof的(BUF),0);
            strcat的(文字,BUF);
        }
    }
}的printf(。日期:%s的名称:%s的文本:%S \\ n,日期,名称,文字);


解决方案

下面是一个简单的接受所有功能:

  INT recv_all(INT的sockfd,无效* buf中,为size_t的len,诠释标志)
{
    为size_t探路者= LEN;
    字符* bufptr =(字符*)BUF;    而(探路者大于0)
    {
        ssiz​​e_t供RSZ =的recv(的sockfd,bufptr,探路者,旗);
        如果(RSZ&下; = 0)
            返回RSZ; / *错误或其他最终封闭cnnection * /        探路者 - = RSZ; / *读取少下一次* /
        bufptr + = RSZ; / *下一个缓冲区的位置读入* /
    }    返回LEN;
}

Possible Duplicate:
What is the correct way of reading from a TCP socket in C/C++?

I'm trying to develop a TCP client/server. My problem is, when I try to send the data from cliente I do it in one sent.

But my problem appears when I try to receive the data with a specific structure, I mean, the first 8 bytes set a date, the next 10 a name, and undefined number of bytes set a text (this text ends with /r/n/r/n)

The client sends as follows:

char date[8];
char name[10];
char msg[4096];

strcpy(msg,"12/10/12"); //8 bytes
strcat(msg,"Kevin Fire"); //10 bytes
strcat(msg,"abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde\r\n\r\n");

nbytes_sent = send(sock,(char *)msg,sizeof(msg),0);
printf("Bytes_sent: %s -> %i\n",msg,nbytes_sent);

And the server try to parse the data from socket as follows:

char date[8];
char name[10];
char * text;
char buf[1024];

int i=0;
for(i=0; i < 8; i++)
    date[i] = '\0';
for(i=0; i < 10; i++)
    name[i] = '\0';

nbytes_read=recv(sclient,(char *)date,sizeof(date),0);
if(nbytes_read > 0){
    printf("Date: %s (%i)\n",date,nbytes_read);
    //cout.flush();
    nbytes_read=recv(sclient,(char *)name,sizeof(name),0);
    if(nbytes_read > 0){
        printf("Name: %s (%i)\n",name,nbytes_read);
        //cout.flush();
        nbytes_read=recv(sclient,(char *)buf,sizeof(buf),0);
        strcpy(text,buf);
        while(nbytes_read > 0){
            nbytes_read=recv(sclient(char*)buf,sizeof(buf),0);
            strcat(text,buf);
        }
    }
}

printf("Date: %s. Name: %s. Text: %s\n",date,name,text);

解决方案

Here's a simple "receive all" function:

int recv_all(int sockfd, void *buf, size_t len, int flags)
{
    size_t toread = len;
    char  *bufptr = (char*) buf;

    while (toread > 0)
    {
        ssize_t rsz = recv(sockfd, bufptr, toread, flags);
        if (rsz <= 0)
            return rsz;  /* Error or other end closed cnnection */

        toread -= rsz;  /* Read less next time */
        bufptr += rsz;  /* Next buffer position to read into */
    }

    return len;
}

这篇关于如何发送和接收数据TCP套接字(C / C ++)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆