функция accept не ожидает соединения (не блокируется) - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь сделать простой сокет-сервер на C и следую учебному пособию в книге «Искусство эксплуатации»

Каждый раз, когда я пытаюсь запустить сервер, я получаю вывод:

Не удалось принять новое соединение

My C Code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 4444

int main(void) {
    // Declare initial values;
    int domain, sock_fd, type;
    struct sockaddr_in localAddr;
    socklen_t addr_length;
    ...
    sock_fd = socket(domain, type, 0);
    ...
    bind(sock_fd, (struct sockaddr *) &localAddr, sizeof(struct sockaddr))
    ...
    // Setup listening
    sock_fd = listen(sock_fd, 1);
    char buffer[1024];
    int sin_size, recv_len;
    while (1) {
        int client_fd;
        struct sockaddr_in clientAddr;
        sin_size = sizeof(clientAddr);
        client_fd = accept(sock_fd, (struct sockaddr *) (&clientAddr), &sin_size);
        if (client_fd == -1) { <----------- HERE
            printf("Could not accept new connection");
            exit(-1);
        }   
        close(client_fd);
    }
    close(sock_fd);
    return 0;
}

1 Ответ

0 голосов
/ 07 марта 2019

Существует ряд ошибок и предупреждений, выдаваемых компилятором для вашего кода.

Но я думаю, что решающим фактором было то, что вы делали,

 sock_fd = listen(sock_fd, 1);

, что должно быть,

 listen(sock_fd, 1);

И что вы использовали команду сокета с неинициализированной переменной.

// sock_fd = socket(domain, type, 0); // wrong
(sock_fd=socket(AF_INET,SOCK_STREAM,0); // correct

Следующие параметры также отсутствовали,

// The following three lines were missing
localAddr.sin_family = AF_INET;
localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
localAddr.sin_port = htons(PORT);

Вотполный код с большим количеством исправлений, в котором все еще есть некоторые предупреждения о неиспользуемых переменных и т. д., но, по крайней мере, все идет к «готовности к принятию соединений».

Вы должны действительно включить все возможные предупреждения на вашем компилятореи прочитайте Книга сетевого программирования Биджа .

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 4444

int main(void) {
    // Declare initial values;
    int domain, sock_fd, type;
    struct sockaddr_in localAddr;

    // The following three lines were missing
    localAddr.sin_family = AF_INET;
    localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    localAddr.sin_port = htons(PORT);

    socklen_t addr_length;

    // sock_fd = socket(domain, type, 0);
    //////////////////////Creating a SOCKET/////////////////////////
    if((sock_fd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
        printf("ERROR:Socket failed\n");
        return -1;
    }

    if (bind(sock_fd, (struct sockaddr *) &localAddr, sizeof(struct sockaddr)) == -1)
    {
        printf("ERROR:Binding on server\n");
        close(sock_fd);
        return -1;
    }

    // Setup listening
    listen(sock_fd, 1);
    char buffer[1024];
    int sin_size, recv_len;
    while (1) {
        int client_fd;
        struct sockaddr_in clientAddr;
        sin_size = sizeof(clientAddr);
        client_fd = accept(sock_fd, NULL, NULL);
        if (client_fd == -1) {
            printf("Could not accept new connection");
            exit(-1);
        }
        close(client_fd);
    }
    close(sock_fd);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...