2014-05-22 53 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