如何发送和接收数据TCP套接字(C / C ++) [英] How to send and receive data socket TCP (C/C++)
问题描述
可能重复:结果
TCP套接字读取正确的方法
<一href=\"http://stackoverflow.com/questions/666601/what-is-the-correct-way-of-reading-from-a-tcp-socket-in-c-c\">What是从C / C ++?
块引用>我试图建立一个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)
{
ssize_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屋!