客户端无法连接到另一台计算机上的服务器-已解决

时间:2020-06-08 01:57:40

标签: c networking network-programming

事实证明问题不止于此....我使用的Linux服务器的防火墙拒绝连接...

我正在编写一个客户端/服务器模型,我的目标是客户端和服务器可以在不同的机器上运行,但是,客户端中的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.

2 个答案:

答案 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);

/* .... */