2016-10-13 2 views
0

Я пытаюсь создать очень простой сервер, который принимает соединение.sockaddr.sin_port = 1337 не соответствует «реальному» открытому порту

int sock, serv; 
struct sockaddr_in in_sock; 
serv = socket(AF_INET, SOCK_STREAM, 0); 
in_sock.sin_addr.s_addr = 0; 
in_sock.sin_port = 1337; 
in_sock.sin_family = AF_INET; 
bind(serv, (struct sockaddr *)&in_sock, sizeof(in_sock)); 
listen(serv, 0); 
client = accept(serv, 0, 0); 

Однако при попытке подключиться к 127.0.0.1:1337, я получаю соединение отказано сообщение:

(UNKNOWN) [127.0.0.1] 1337 (?): Соединение отклонено

Однако простой netstat -tcpan показывает мне, что порт действительно открыт:

ТСР 0 0 0.0.0.0: 14597 0.0.0.0:* LISTEN

Если я установил sin_port с гораздо более высокими портами, он, похоже, работает нормально.

Что мне здесь не хватает? Почему не открывается порт 1337? Кажется, он тоже свободен.

+0

вы должны использовать [ 'htons'] (https://linux.die.net/man/3/htons) для порта, чтобы переключить порядок байт –

ответ

3

Поле номера порта в struct sockaddr_in хранится в сетевом порядке. Это означает, что вы должны использовать htons() при сохранении значения к нему:

in_sock.sin_port = htons(1337); 

В противном случае, номер порта будет оставлен байт-местами. Какие именно то, что произошло здесь:

1337 = 0x0539 
14597 = 0x3905 
+0

Это смешно, я подумал, что это может быть проблема, я должен был глубже проникнуть в нее. Большое спасибо, это была проблема. – user96649

1
listen(serv, 0); 

Второй аргумент listen является backlog и если мы посмотрим на documentation for listen:

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

ECONNREFUSED - это именно сообщение об ошибке, которое вы получаете, потому что накопитель заполнен (он может содержать 0 подключений, чтобы он всегда был полным). Вы должны увеличить это число как минимум до 1, но более высокая сумма может быть лучше listen(serv, 10);.

+0

Удовлетворительный , но тогда почему я могу подключиться к порту, показанному netstat? Таким образом, порт открывается по правильному адресу, отправляет мне ECONNREFUSED, но другой открыт в неправильном порту, но я могу подключиться к нему? – user96649

Смежные вопросы