我写了一个简单的代码到 send()和 recv()数据,但是当我 recv()<时我得到的错误为-1 / em>数据。发送不会给出任何错误。
服务器代码:
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;
}
答案 0 :(得分:0)
可能会出现许多错误。您应该使用GetLastError()来了解更多信息。
另外,我注意到在客户端和服务器示例中,您都没有完全初始化&#34; sockaddr_in name&#34;,例如name.ai_addr保持不变。如果是TCP(SOCK_STREAM),则需要一个地址才能连接。
答案 1 :(得分:-1)
我认为这可能是您的问题:您只从客户端发送11个字节,但服务器在等待14个字节时阻塞。客户端发送11个字节后,它退出,导致套接字层终止连接。但是,当启动关闭序列时,服务器仍在等待额外的3个字节。
为避免这种情况,在客户端,您可以发送包含消息长度的固定大小的标头。在服务器端,首先回收标题,提取消息的长度,然后再次使用此长度调用recv。