我正在處理我正在建立的TCP連接的問題。當從客戶端向服務器發送數據時,服務器似乎「等待」另一個'recv()'(對我而言不那麼明顯),並且客戶端從不退出,因爲它已完成發送部分並等待'recv )'來自服務器的答案。這到了一種僵局。TCPconnection:服務器不'理解',接收結束
以下代碼是我認爲問題所在的部分。
Server代碼:
#define BUFFSIZE 1024;
char buffer[BUFFSIZE];
/*...*/
bzero(buffer,BUFFSIZE);
while(received > 0) { /* indicates end of connection */
/* recv: Check for more data coming from client*/
printf("before recv\n");
if((received = recv(sock,buffer,BUFFSIZE-1,0)) < 0){
perror("Failed to recv bytes from client");
exit(1);
}
printf("received %d bytes \n", received);
sum_bytes += received;
printf("after recv\n");
if(strstr(buffer,"End")) {
printf("strstr: %s\n",buffer);
break;
}
bzero(buffer,BUFFSIZE);
}
printf("\ntotal bytes received are %d \n", sum_bytes);
客戶端代碼:
for(i=0; i<num_packets; i++){
/* Send the packet to the server */
char packet[packet_size];
bzero(packet,packet_size);
if((sent = send(sockfd,packet,packet_size,0)) != packet_size){
perror("Client: send() sent a diff num of bytes than expected");
exit(1);
}
bytes += sent;
}
/* send another final packet("End")in order to inform server that sending is over */
if((sent = send(sockfd,"End",3, 0)) != 3) {
perror("Client:send() sent a diff num of bytes than expected");
}
bytes += sent;
printf("total bytes sent are %d \n", bytes);
}
正如你可以看到,我不介意發送DATAS但只有約包大小。 此代碼作品完美爲1包發送 ...但不是更多! :/ 如果發送的數據包多於要發送的數據包,則客戶端「阻塞」(需要^ C退出),服務器在循環開始時停止,在收到所有數據後循環!)。
我還有一個疑問,如果我使用'sizeof(BUFFSIZE)'而不是'BUFFSIZE',相同的確切代碼工作正常。我想知道爲什麼......:/任何想法?
例如./client:
END total bytes sent are 1034 /* press ^C */
./server:
的recv之前
接收358個字節
的recv後
之前的recv
接收676個字節
的recv後
BEF的recv/* stucks這裏*/(...當我按下客戶CTR-C以下來... ...)
收到0字節
的recv後收到的總字節數是1034/**接收的字節數量合適! **/
你可以張貼更正的代碼摘錄作爲一個答案? – 2012-01-10 14:23:43
在這裏你:) – FILIaS 2012-01-10 14:37:51