我正在尝试实现一个客户端-服务器程序。 然而,虽然服务器程序运行正常,但客户端程序退出并出现错误:: recv:传输端点未连接。 它让我困惑了很长一段时间。一些帮助将不胜感激! 这是服务器程序::
#include <stdio.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/in.h>
int main()
{
int sockid,newsockid,pid;
struct sockaddr_in myaddr,clientaddr;
socklen_t x;
x=sizeof(clientaddr);
char msg[20];
sockid=socket(AF_INET,SOCK_STREAM,0);
if(sockid == -1)
perror("SOCKET");
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family=AF_INET;
myaddr.sin_port=htons(8888);
myaddr.sin_addr.s_addr=inet_addr(INADDR_ANY);
if(bind(sockid,(const struct sockaddr *)&myaddr,sizeof(myaddr)) == -1)
perror("bind");
listen(sockid,5);
newsockid=accept(sockid,(struct sockaddr *)&clientaddr,&x);
if(newsockid == -1)
perror("accept");
printf("NEW CLIENT ADDR:: %s",ntohs(clientaddr.sin_addr.s_addr));
pid=fork();
while(1)
{
if(pid == 0)
{
memset(msg,'\0',20);
if(recv(newsockid,msg,sizeof(msg),0) == -1)
perror("recv");
puts(msg);
if(strcmp(msg,"exit") == 0)
{
close(newsockid);
exit(getpid());
}
}
if(pid!=0)
{
memset(msg,'\0',20);
gets(msg);
if(send(newsockid,msg,sizeof(msg),0) == -1)
perror("send");
if(strcmp(msg,"exit") == 0)
{
close(newsockid);
exit(getpid());
}
}
}
return 0;
}
这也是客户端的事情::
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/in.h>
int main()
{
int pid,sockfd;
char msg[20];
struct sockaddr_in myaddr;
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1)
perror("socket");
myaddr.sin_family=AF_INET;
myaddr.sin_port=htons(8888);
myaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
if(connect(sockfd,(struct sockaddr *)&myaddr,sizeof(myaddr)) == -1)
perror("connect");
pid=fork();
while(1)
{
if(pid == 0)
{
memset(msg,'\0',20);
if(recv(sockfd,msg,sizeof(msg),0) == -1)
{
perror("recv");
exit(getpid());
}
puts(msg);
if(strcmp(msg,"exit") == 0)
{
close(sockfd);
exit(getpid());
}
}
if(pid!=0)
{
memset(msg,'\0',20);
gets(msg);
if(send(sockfd,msg,sizeof(msg),0) == -1)
perror("send");
if(strcmp(msg,"exit") == 0)
{
close(sockfd);
exit(getpid());
}
}
}
return 0;
}
最佳答案
服务器代码中有 2 个错误。
这一行有一个:
myaddr.sin_addr.s_addr=inet_addr(INADDR_ANY);
inet_addr
函数需要一个字符串,而 INADDR_ANY
常量是一个全零的 IP 编号。服务器代码因段错误而崩溃,直到该行被更正为止(它真的对你有用吗?)。正确用法:
myaddr.sin_addr.s_addr=htonl(INADDR_ANY);
此外,printf
行不正确 - 地址不短,而是很长,而且您不能使用%s
(它很可能会崩溃)。请注意,编译器(至少是 gcc
)会对此发出警告 - 您应该始终启用并阅读编译器警告。作为快速修复,我将其更改为:
printf("NEW CLIENT ADDR:: %08x",ntohl(clientaddr.sin_addr.s_addr));
只要你能读取十六进制的 IP 就可以了:)
通过这些修复,它对我来说工作得很好(我的意思是服务器和客户端) - 请注意,可能还有其他错误,我必须承认我没有仔细阅读它。
关于客户端 : recv transport endpoint not connected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13674007/