TCP-сервер в C - порты всегда увеличивается? - PullRequest
1 голос
/ 31 марта 2011

Это основной код моей серверной программы на C:

int main(int argc, char** argv)
{
    int sock, connected, bytes_received, true = 1;

    struct sockaddr_in server_addr, client_addr;
    int sin_size;

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("Socket");
        exit(1);
    }

    if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &true, sizeof (int)) == -1) {
        perror("Setsockopt");
        exit(1);
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(atoi(argv[1]));
    server_addr.sin_addr.s_addr = INADDR_ANY;
    bzero(&(server_addr.sin_zero), 8);

    if (bind(sock, (struct sockaddr *) &server_addr, sizeof (struct sockaddr))
            == -1) {
        perror("Unable to bind");
        exit(1);
    }

    if (listen(sock, 5) == -1) {
        perror("Listen");
        exit(1);
    }

    printf("\nTCPServer Waiting for client on port 5000");
    fflush(stdout);

    while (1) 
    {
        pthread_t child;

        sin_size = sizeof (struct sockaddr_in);
        connected = accept(sock, (struct sockaddr *) &client_addr, &sin_size);
        printf("\n I got a connection from (%s , %d)\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

        threadInfo info;
        info.argumentsPassedToCode = argv;
        info.connected = connected;

        pthread_create(&child, NULL, interpretMessage, &info);
    }

    close(sock);
    return 0;
}

Мой сервер всегда распечатывает IP-адрес входящего соединения и порт, с которого оно приходит. Я заметил, что порты всегда увеличиваются.

  1. Это нормально? Если нет, то что я делаю не так?
  2. Если мой сервер работает долго, не хватит ли у него портов? Если так, что произойдет?

Ответы [ 3 ]

4 голосов
/ 31 марта 2011
  1. Если ваш сервер работает, вы не делаете ничего плохого. Исходные порты не обязательно следуют шаблону, они просто существуют для завершения кортежа соединения (исходный порт, адрес источника, порт назначения, адрес назначения).
  2. Порты повторно используются после закрытия соединений, поэтому с вами все будет в порядке.
2 голосов
/ 31 марта 2011

TCP имеет состояние TIME_WAIT, которое используется, чтобы убедиться, что все было отправлено и получено правильно перед очисткой сокета. Это происходит после того, как вы закрыли сокет в вашем коде. Время, в течение которого сокет находится в состоянии TIME_WAIT, зависит от ОС.

Вот почему вы не получаете тот же порт снова для клиентских подключений.

Подробнее о состоянии вы можете прочитать здесь: https://stackoverflow.com/questions/41602/how-to-forcibly-close-a-socket-in-time-wait

2 голосов
/ 31 марта 2011

1) Да;выбран следующий доступный порт.Это может быть тот же порт (если прежний сокет уже был освобожден ядром), это может быть следующий свободный или любой другой свободный порт, от 1024 до 65535 (первые 1024 зарезервированы, как вы знаете);В вашем случае вы видите другой номер клиентского порта, потому что либо вы неправильно закрываете сокет клиента, либо предыдущий сокет все еще задерживается, когда вы делаете следующее соединение, или вы просто делаете несколько параллельных соединений

2) Если вы не закрываете сокеты должным образом, вы это сделаете (вероятно, сначала не хватит файлового дескриптора, если у вас более низкие предельные значения для каждого процесса по умолчанию, которые составляют ... 1024 fds на процесс?);Если вы их правильно снесете, то все будет в порядке

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