C: привязка сокета к неправильному порту - PullRequest
2 голосов
/ 11 ноября 2010

У меня есть код C, который прослушивает порт, но прослушивает не тот порт.

Это определено в файле .h:

#define PHANTASIA_PORT 2101

Розетка:

int the_socket, error, on=1;

    /* create a socket */
errno = 0;
if ((the_socket=socket(AF_INET, SOCK_STREAM, 0)) == -1) {

    sprintf(error_msg,
       "[0.0.0.0:?] Socket creation failed in Do_init_server_socket: %s\n",
       strerror(errno));

    Do_log_error(error_msg);
    exit(SOCKET_CREATE_ERROR);
}

error = setsockopt(the_socket, SOL_SOCKET, SO_REUSEADDR,
        (char *) &on, sizeof(on));

Вот как это связывает:

    /* set up the bind address */
bind_address.sin_family = AF_INET;
bind_address.sin_addr.s_addr = INADDR_ANY;
bind_address.sin_port = PHANTASIA_PORT;

    /* bind to that socket */
error = bind(the_socket, (struct sockaddr *) &bind_address,
        sizeof(bind_address));
error = listen(the_socket, SOMAXCONN);

Но когда он запускается, lsof сообщает:

phantasia  2400     root    4u  IPv4 2024436       TCP *:13576 (LISTEN)

Когда я изменил порт на 2100 в определении, он вместо этого прослушивал:

phantasia  2266     root    4u  IPv4 2021315       TCP *:13320 (LISTEN)

Это старый код, но при компиляции нет предупреждений или ошибок. Может быть, что-то происходит у меня над головой. У меня есть журнал отладки, когда он связывается, и он сообщает, что связывается с портом 2101.

Ответы [ 2 ]

6 голосов
/ 11 ноября 2010

Заменить PHANTASIA_PORT на htons(PHANTASIA_PORT).

2 голосов
/ 11 ноября 2010

Используйте htons функцию при указании номера порта.

Таким образом, эта строка:

bind_address.sin_port = PHANTASIA_PORT;

Должно быть:

bind_address.sin_port = htons(PHANTASIA_PORT);

htons - это функция, которая преобразует целые числа хоста в сетевые целые числа, фиксируя их порядковый номер (порядок байтов HI-LO / LO-HI в целых числах), если это необходимо.

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