我需要對在套接字程序中使用多個發送/接收進行說明。 我的客戶端程序如下所示(使用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
正如我們可以看到,有在。OUPUTS一些矛盾, 從客戶端看起來一切郵件正在發送,但在服務器中,msg將基於buf大小接收,這裏儘管buf1的大小爲20,爲什麼'cli3''cli4''cli4'msgs沒有在bu上收到F1?有沒有特定的限制?請澄清一下。
由於事先 拉賈
send()和recv()是什麼返回值?你不能忽視這一點。 –
您正在發送5個字節和15個字節的緩衝區,但在接收時,您正在打印以第一個「NUL」字節(0x00)結尾的字符串。如果你保存了'recv()'調用的返回值並打印它們,這可能會有所幫助。 – TripeHound
傳遞的'len'是允許的最大長度。 'recv'可以返回一個字符或者(在非阻塞系統中)a -'1'。您的「問題」屬於進程調度:它取決於在上下文切換之前執行的代碼點以及內核已經分離的內容。 – LPs