我需要在套接字程序中使用多个send / recv进行一些澄清。 我的客户端程序如下所示(使用TCP SOCK_STREAM)。
send(sockfd,"Messgfromlient",15,0); send(sockfd,"cli1",5,0); send(sockfd,"cli2",5,0); send(sockfd,"cli3",5,0); send(sockfd,"cli4",5,0); send(sockfd,"cli5",5,0);
服务器程序如下所示。
recv(newsockfd,buf,20,0); printf("Buffer is %sn",buf);
当我执行上面的程序时,输出如下:
客户端消息:Messgfromlient
我相信buf大小是20,所以只收到一个缓冲区。 在服务器端添加一个recv。
char buf[20],buf[20]; ------skipped------ recv(newsockfd,buf,20,0); recv(newsockfd,buf1,20,0); printf("Client Msg :%sn",buf); printf("Client Msg :%s n",buf1);
输出:第一次试用:
Client Msg :Messgfromlient Client Msg :cli2
第二道:
Client Msg :Messgfromlient Client Msg :cli1
我们可以看到输出中存在一些矛盾,从客户端来看它看起来所有的msg都被发送了,但是在服务器中,将根据buf大小接收msg,这里虽然buf1的大小为20,为什么’cli3’在buf1上没有收到’cli4”cli4’msgs? 那有什么特别的限制吗? 请澄清一下。
Raja,先谢谢你
TCP是基于字节流的协议,它对消息一无所知。 您总共发送25
个字节,另一侧的每个recv
将读取其中一些字节。 你可以得到20,你可能得到1
,然后在下一次读取时得到19
,你可能得到5
然后是4
然后是11
然后5. recv
的size参数是要读取的最大数量。
您需要循环,直到您自己阅读整个消息,并且还了解您可能会在同一收到的消息中收到多个“发送”。
服务器程序如下所示。
recv(newsockfd,buf,20,0); printf("Buffer is %sn",buf);
这已经错了。 它应该是:
int count = recv(newsockfd,buf,20,0); if (count == -1) { perror("recv"); // please improve this message close(newsocketfd); } else if (count == 0) { // peer has closed the connection close(newsockfd); } else { printf("Buffer is %.*sn",count,buf); }
这应该给你足够的暗示……
你有2个问题:
当您显示结果时,您将停在第一个空字节处,该字节始终位于“Messgfromlient”之后。 可能已收到更多文本,但您没有显示它。
第二个问题是TCP连接是一个流。 您可以一次性接收所有数据,您可能只收到第一个字节。 你不知道它是哪一个,也无法预测它。 您需要在应用程序中处理不完整的读取,并且必须处理重试。
但是,您可以更有可能将所有数据都发送到一个数据包而不是6.请查看TCP_CORK选项。
以上就是c/c++开发分享在socket中发送多个send / recv相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/549335.html