Причина ошибки подключения при программировании сокетов (на стороне клиента)? - PullRequest
0 голосов
/ 04 октября 2019

У меня проблемы с моим connect() методом на стороне клиента моего программирования сокетов. Я не уверен, связана ли проблема с моим кодом или с моим методом его запуска. Я запускаю его в двух отдельных окнах терминала - одно для сервера (который я запускаю первым) с помощью команды ./server 8080 и одно для клиента с помощью команды ./client 4 8080 hello. Когда я запускаю свой код, серверная программа останавливается в цикле while сразу после строки printf("this prints\n"). Я предполагаю, что это означает, что он ожидает подключения клиента к нему. Клиентская программа завершается ошибкой при вызове connect() и выводит мое сообщение об ошибке «Ошибка подключения». Мой код размещен ниже.

Код сервера:

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h> 
#include <string.h> 
#include <sys/wait.h> 

#define bufsize 1024

void eatZombies(int n){
    wait3(NULL,WNOHANG,NULL); // Nom Nom 
}

int main(int argc, char *argv[]){
    int sock, length, msgsock, status;
    struct sockaddr_in server;
    pid_t id;       
    signal(SIGCHLD, &eatZombies);
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(atoi(argv[1])); // this time 1st arg is port#
    if(bind(server_fd, (struct sockaddr *)&server, sizeof(server)) < 0){
        printf("Error binding the socket\n");
        exit(0);
    }

    if(listen(server_fd, SOMAXCONN) < 0){
        printf("Error listening for connections\n");
        exit(0);
    }
    char buffer[1024] = {0}; 
    char *hello = "Hello from server"; 
    int addrlen = sizeof(server);    
    while(1){
        printf("this prints\n");
        int client_fd = accept(server_fd, (struct sockaddr *)&server, (socklen_t*)&addrlen);
        printf("this doesnt\n");
        if(client_fd < 0){
            printf("Error accepting connection\n");
            exit(0);
        }
        // the next call makes a new child process that will actually handle the client.
        id = fork();
        // when id == 0, this is the child and needs to do the work for the server. 
        // when if > 0, this is the parent, and it should just loop around,
        // when id < 0, we had an error.
        if(id > 0){
            continue;
        }
        else if(id < 0){
            printf("Error\n");
            exit(0);
        }  
        read(client_fd, buffer, 1024); 
        printf("%s\n", buffer); 
        write(client_fd, hello, strlen(hello), 0); 
        printf("Hello message sent\n");
        exit(0);
    }
    return 0;
}

Код клиента:

#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define bufsize 1024

int main(argc, argv) int argc; char *argv[];{
    int sock, rval;
    struct hostent *host;
    struct sockaddr_in server;  // not a pointer
    char buf[bufsize];
    printf("%d\n", argc);
    if(argc != 4){
        printf("usage:\ntcpclient hostname port string\n\n");
        return(-1);
    }
    // look up hostname (server) using DNS
    if ((host = gethostbyname(argv[1])) == 0) {
        fprintf(stderr, "%s: unknown host\n", argv[1]); 
        return(-1);  
    }
    // Set up fields for socket to point to host and port
    bcopy(host->h_addr, &server.sin_addr, host->h_length);
    server.sin_family = AF_INET;
    server.sin_port = htons(atoi(argv[2]));
    // Create socket 
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0){
        printf("Socket Creation Failed\n");
        exit(0);
    }
    // connect (3-way handshake)
    if(connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0){ 
        printf("Connection Failed\n"); 
        exit(0); 
    } 
    // Copy the arg into buf so we can send it to the server
    strncpy(buf, argv[3], bufsize);
    // Send sentence to server
    send(sock, buf, strlen(buf), 0);
    printf("Message sent\n");
    // read response from server
    rval = read(sock, buf, bufsize);
    // print result to window
    fprintf(stdout,"%s\n", buf);
    close(sock);
}

1 Ответ

3 голосов
/ 04 октября 2019

При работе ./client 4 8080 hello, 4 - это имя хоста. Вы хотели позвонить ./client localhost 8080 hello.

Так что это была просто ошибка при вызове приложения, а не в коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...