c системный вызов connect () зависает на стороне клиента (сетевое программирование) - PullRequest
0 голосов
/ 11 апреля 2019

Я изучаю сокеты и следую некоторому примеру кода из учебника. У меня есть два компьютера, один работает как сервер, а другие серверы как клиент. Я пытаюсь заставить два компьютера общаться через сокеты, но клиентский метод connect () зависает. Потому что я только начинаю учиться, поэтому понятия не имею, что происходит.

Я пытался найти c connect () зависает, но безуспешно. Я узнал IP своего сервера по ifcongif inet 138.51.83.123

Сервер:

#include <sys/stat.h> 
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <limits.h>
#include <sys/wait.h> 
#include <arpa/inet.h> 
#include <netinet/in.h> 
#include <ctype.h> 
#include <sys/types.h> 
#include <signal.h> 

#define SIZE sizeof(struct sockaddr_in)

void catcher(int sig);
int newsockfd;

int main(){
    int sockfd;
    char c;
    struct sockaddr_in server = {AF_INET, 7000, INADDR_ANY};
    static struct sigaction act;

    act.sa_handler = catcher;
    sigfillset(&(act.sa_mask));
    sigaction(SIGPIPE, &act, NULL);

    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
        perror("socket call failed");
        exit(1);
    }

    if(bind(sockfd, (struct sockaddr*)&server, SIZE) == -1){
        perror("bind call failed");
        exit(1);
    }

    if(listen(sockfd, 5) == -1){
        perror("listen call failed");
        exit(1);
    }

    for(;;){
        if((newsockfd = accept(sockfd, NULL, NULL)) == -1){
            perror("accept call failed");
            continue;
        }

        if(fork() == 0){
            // keep reading if not EOF
            while(recv(newsockfd, &c, 1, 0) > 0){
                printf("***received: %c\n", c);
                c = toupper(c);
                send(newsockfd, &c, 1, 0);
            }
            close(newsockfd);
            exit(0);
        }
        // parent no need for newsockfd
        close(newsockfd);
    }
    return 0;
}

void catcher(int sig){
    close(newsockfd);
    exit(0);
}

клиент:

#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h> // for open
#include <unistd.h> // for close

#define SIZE sizeof(struct sockaddr_in)

int main(){

    int sockfd;
    char c, rc;
    struct sockaddr_in server = {AF_INET, 7000};
    server.sin_addr.s_addr = inet_addr("138.51.83.71");
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
        perror("socket call failed");
        exit(1);
    }

    if(connect(sockfd, (struct sockaddr*)&server, SIZE) == -1){
        printf("here\n");
        perror("connect call failed");
        exit(1);
    }

    printf("here\n"); // never got printed out


    for(;;){
        printf("Input a lowercase char\n");

        c = getchar();
        send(sockfd, &c, 1, 0);

        if(recv(sockfd, &rc, 1, 0) > 0) printf("receive: %c", rc);
        else{
            printf("server died\n");
            close(sockfd);
            exit(1);
        }
    }

}

в клиенте, printf("here\n"); // never got printed out, поэтому я предполагаю, что клиент connect() зависает (я пытался поместить этот printf до connect(), и он был распечатан). Кто-нибудь может помочь? Потому что у меня нет предварительных знаний о сетевом программировании, поэтому я не знаю, как их отлаживать.

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Кажется, ваш клиент не видит ваш сервер (с помощью ping вы сможете обнаружить эту ситуацию). Если вы являетесь пользователем Linux, простой способ отладки такого рода программ - использование netcat. Netcat - это инструмент, который позволяет вам, между прочим, создавать клиентов или сервер через UDP или TCP. Если у вас есть фрагменты кода на разных машинах, я бы изменил (только в целях отладки) IP на localhost и запустил бы:

На сервере:

netcat localhost 7000
hello world

Это TCP-сервер, который, как вы знаете, работает хорошо, поэтому вы сможете обнаружить, если что-то не так на вашем сервере.

На клиентском компьютере

netcat -l localhost 7000

Подобно серверу-серверу, эта команда создает TCP-сервер, прослушивающий localhost: 7000.

Вполне возможно, что это не решит вашу проблему, потому что, похоже, это проблема конфигурации, и вам сложно дать совет, если мы не знаем, с какими машинами и настройками конфигурации вы работаете. Но я думаю, что Netcat - мощный инструмент для этой цели.

1 голос
/ 11 апреля 2019

Сначала попытайтесь пропинговать IP-адрес сервера с вашего клиентского компьютера и посмотрите результаты. Если эхо-запрос не был успешным, это означает, что есть какая-то проблема с вашим сетевым подключением. Я запустил вашу программу с IP-адресом сервера как 127.0.0.1 (localhost), и он запустился отлично, что свидетельствует о том, что с вашим кодом все в порядке.

...