在socket中发送多个send / recv

我需要在套接字程序中使用多个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 %s\n",buf); 

当我执行上面的程序时,输出如下:

客户端消息:Messgfromlient

我相信buf大小是20,所以只收到一个缓冲区。 在服务器端添加一个recv。

  char buf[20],buf[20]; ------skipped------ recv(newsockfd,buf,20,0); recv(newsockfd,buf1,20,0); printf("Client Msg :%s\n",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 %s\n",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 %.*s\n",count,buf); } 

这应该给你足够的暗示……

你有2个问题:

当您显示结果时,您将停在第一个空字节处,该字节始终位于“Messgfromlient”之后。 可能已收到更多文本,但您没有显示它。

第二个问题是TCP连接是一个流。 您可以一次性接收所有数据,您可能只收到第一个字节。 你不知道它是哪一个,也无法预测它。 您需要在应用程序中处理不完整的读取,并且必须处理重试。

但是,您可以更有可能将所有数据都发送到一个数据包而不是6.请查看TCP_CORK选项。