2014-05-22 55 views
0

我寫了一個簡單的代碼來的send()的recv()的數據,但我得到了錯誤爲-1,而我的recv()數據。發送不會給出任何錯誤。套接字的send()和recv()不工作

Server代碼:

struct sockaddr_in name; 
char *buf; 

int main(int agrc, char** argv) { 

int sock, new_sd; //sock is this socket, new_sd is connection socket 
int adrlen, cnt; 

name.sin_family=AF_INET; 
name.sin_port=htons(6050); 

sock = socket(AF_INET, SOCK_STREAM, 0); 

if (sock < 0) { 
    printf("\nserver socket failure "); 
    printf("\nServer: "); 
    exit(1); 
} 
printf("sockfd=%d\n",sock); 
adrlen=(socklen_t)sizeof(name); 
if((bind (sock,(struct sockaddr *)&name,adrlen)) < 0) 
    printf("\nBind failure"); 
if(listen(sock, 5) < 0) 
    printf("\nlisten error "); 
printf("listen done\n"); 
while(1) { 
    if(new_sd =(accept(sock,(struct sockaddr *)&name,(socklen_t*)&adrlen)) < 0) { 
     printf("\nserver accept failure "); 
     exit(1); 
    } 
    printf("new_sd=%d",new_sd); 

    buf = (char *)malloc(14); 
    if((recv(new_sd,(void *)buf,14,MSG_WAITALL)) < 0){ 
     printf("\nError receiving data "); 
     exit(1); 
    } 
} //end while 
return 0; 
} 

客戶端代碼:

char buf[14]; 
struct sockaddr_in name; 

int main(int agrc, char** argv) { 

int sock, new_sd, adrlen, cnt; 
name.sin_family=AF_INET; 
name.sin_port=htons(6050); 

sock = socket(AF_INET, SOCK_STREAM, 0); 

if (sock < 0) { 
    printf("\nserver socket failure "); 
    printf("\nServer: "); 
    exit(1); 
} 

//stuff for server socket 
printf("sock is %d\n",sock); 
adrlen=(socklen_t)sizeof(name); 


if((connect(sock,(struct sockaddr *)&name,adrlen)) < 0) { 
    printf("\nclient connection failure "); 
    exit(1); 
} 

printf("\nSuccessful connection from client 1"); 

strcpy(buf,"\nclientsend"); 

if((send(sock,(void *)buf,strlen(buf), 0)) < 0) { 
    printf("\nError sending data from client 1 "); 
    exit(1); 
} 
printf("\nExiting normally"); 
return 0; 
} 
+4

代碼太多,關於錯誤的細節太少。至少打印出錯誤信息(使用'perror'),以便知道導致recv失敗的原因。 – Mat

+0

你忘了在'struct sockaddr_in'結構中添加你要連接的地址。 – Unknown

+0

錯誤處理是......呃......'printf(「哦,不,致命失敗」);沒問題,讓我們繼續......' –

回答

-1

我認爲這可能是你的問題:你是從客戶端發送只有11個字節,但在等待服務器攔截14個字節。在客戶端發送11個字節後,它退出導致套接字層終止連接。但是,當關閉序列啓動時,服務器仍在等待額外的3個字節。

爲了避免這種情況,可以在客戶端發送一個包含消息長度的固定大小的頭。在服務器端,首先recv標題,提取消息的長度,然後再用此長度再次調用recv。

+0

'recv()'一收到一個或多個字節就立即解除阻塞。它不'阻止等待[全部] 14個字節'。 – EJP

0

可能會出現一些錯誤。您應該使用GetLastError()來了解更多信息。

此外,我注意到,在客戶端和服務器示例中,您沒有完全初始化「sockaddr_in name」,例如name.ai_addr保持原樣。在TCP(SOCK_STREAM)的情況下,你需要一個地址來連接。

+0

你的意思是'WSAGetLastError()。' – EJP