我正在编写一个客户端/服务器模型,我的目标是客户端和服务器可以在不同的机器上运行,但是,客户端中的connect()总是返回-1。 Ping可在两台机器之间双向执行。 该代码可在同一台计算机上工作。
client.c
int fd;
int PORT;
char IP[20];
struct hostent *server;
printf("Enter Port Number: \n");
scanf("%d", &PORT);
printf("Enter IP Address: \n");
scanf("%s", IP);
server = gethostbyname(IP);
socklen_t len;
struct sock_opts *ptr;
struct sockaddr_in serv_addr;
fd = socket(AF_INET, SOCK_STREAM, 0);
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(IP);
serv_addr.sin_port = htons(PORT);
connect(fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)); //connection timed out
server.c
int sockfd, newsockfd, clilen, n;
int PORT;
printf("Enter Port Number: \n");
scanf("%d", &PORT);
struct sockaddr_in serv_addr, cli_addr;
char buffer[128];
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(PORT);
bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr));
listen(sockfd,5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
输出: ./client
Enter Port Number:
5544
Enter IP Address
192.168.1.56
ERROR: Connection timed out
./服务器
Enter Port Number:
5544
Server will then time out because client is not able to connect.
答案 0 :(得分:0)
我认为有两件事可以帮助您。
Firstyl,您可以使用wireshark或tcpdump之类的工具查看套接字的运行情况。
第二,连接返回值可以提供许多信息,您可以看到this。
下次,请记住提供完整的代码,以显示您的问题。
答案 1 :(得分:0)
我不确定服务器如何超时。如果未中断并且套接字正在阻塞,则如果服务器未收到任何连接,则服务器应永远在accept()
处暂停。快速浏览并根据您报告的行为,服务器代码首先终止,因此客户端变为无连接。
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
这是您的服务器出问题的地方。您没有在将clilen
传递给accept()
之前对其进行初始化。您的服务器代码可能在调用accept()
/* .... */
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
/* .... */