C - socket bind () errno 22 - нет времени ожидания - PullRequest
0 голосов
/ 23 октября 2019

Я довольно новичок в C & Linux, и я попытался настроить сервер сокетов TCP для обмена данными с C-кодом, который я скомпилировал и выполнил в системе Ubuntu.

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

Затем я перезапустил машину с Ubuntu и с тех пор не могу больше запускать сервер.

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

Я предполагал, что "старый" сокет находится в состоянии ожидания времени или еще не закрыт, но я проверил все соединения с"ss -all state xxx" для всех разных состояний, и все кажется в порядке.

Также пытался использовать разные порты и коды - та же проблема.

Надеюсь, что любой может помочь мне с этой проблемой, так как яне знаю, что еще попробовать.

// C-Code Server
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <time.h> 

int main(int argc, char *argv[])
{

    int listenfd = 0, connfd = 0;
    struct sockaddr_in serv_addr; 

    char sendBuff[1025];
    time_t ticks; 

    //Open a socket
    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    memset(&serv_addr, '0', sizeof(serv_addr));
    memset(sendBuff, '0', sizeof(sendBuff)); 
    if (listenfd == -1) {
        printf("Error: unable to open a socket\n");
        exit(1);
    }

    //Create an Adress
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htons(INADDR_ANY);
    serv_addr.sin_port = htons(1234); 


    //Macht schon benutzte Adresse mit SO_REUSEADDR nutzbar
    int opt = 1;
    if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt))<0) {
        perror("setsockopt");exit(EXIT_FAILURE);
    }
    if(setsockopt(listenfd, SOL_SOCKET, SO_REUSEPORT, (char *)&opt, sizeof(opt))<0)   {
        perror("setsockopt");exit(EXIT_FAILURE);
    }


    bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 

    if ((bind(listenfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))) == -1) {
        printf("Error: unable to bind\n");
        printf("Error code: %d\n", errno);
        exit(1);
    }



    listen(listenfd, 10); 

    while(1)
    {
        connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); 

        if (connfd == -1) {
            printf("Error: unable to accept connections\n");
            printf("Error code: %d\n", errno);
            exit(1);
        }



        ticks = time(NULL);
        snprintf(sendBuff, sizeof(sendBuff), "%.24s\r\n", ctime(&ticks));
        write(connfd, sendBuff, strlen(sendBuff)); 

        close(connfd);
        sleep(1);
     } 
}
...