當前位置:編程學習大全網 - 編程語言 - socket編程中的接收數據丟失問題

socket編程中的接收數據丟失問題

TCP協議通信,接收方接收數據的前後次序與發送方壹致,但數據包不壹定壹致。打個比方,發送方按順序發送了2個數據包,接收可能僅接收1次就能全部收到,也可能需要收2次才能收到,也可能收3次,每次收到的數據大小不壹定和發送方發送的數據包大小壹樣,但最終收到的總數據是壹致的。

從妳的程序來看,客戶端連續發送2包數據,服務器端有可能壹次就全部接到,也可能分2次收到,也可能會收2次以上才能收到。如果在發送“########helloworld”和“######whatisit”之間增加壹些延時語句,比如延時1秒,那麽可以肯定服務器端只能收到1次,因為在發送第1包數據的時候,服務器端就接收到壹次數據,而在發送第2包數據時,服務器已經不再有接收動作了。

就現在的客戶端程序來說,如果要在服務器端收到所有數據,可以考慮在服務器端循環接收數據,拼裝數據,直到收不到數據為止,然後輸出所有接收到的數據。

while(1)

{

int rr;

sock_fd = accept( sock, NULL, NULL);

retval = 0;

while(1)

{

rr = recv( sock_fd, buf1, MAX_BUFLEN, 0 );

if(rr==0) break;

memcpy(buf+retval,buf1,rr);

retval+=rr;

}

printf("buf= %s\n ##retval=%d\n",buf,retval);

write(sock_fd,"get the call\n",sizeof("get the call\n")-1);

}

可以試試看。僅供參考。

查到個函數ioctlsocket

while(1)

{ int rr;

sock_fd = accept( sock, NULL, NULL);

retval = 0;

int iMode = 1; //0:阻塞

ioctlsocket(sock_fd,FIONBIO, (u_long FAR*) &iMode);//非阻塞設置

while(1) { ....... }

........

}

  • 上一篇:拓展項目:畢業墻
  • 下一篇:用文言文寫作文應註意什麽
  • copyright 2024編程學習大全網