2013-09-01 2 views
-1
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) 

Я правильно понимаю, что это будет использовать локальный порт для этого сокета и может ли кто-нибудь уточнить, какой порт он решает использовать? Есть ли способ контролировать, какой локальный порт открыт сокет?Запрос на функцию socket()

+0

Пожалуйста, прочитайте 'man socket'. – alk

+1

Опять такой случай, когда вопросник, похоже, решил, что это может быть меньше усилий, позволяя другим сказать ему/ей ответ на то, что он/она хочет знать, а затем делать собственные исследования. Предположение вопроса просто неверно, из чего можно сделать вывод, что никаких предварительных исследований не было сделано вообще. – alk

+0

@alk Какой смысл в этом посте, кроме как запросить у вас очки? Достаточно людей ответили на вопрос и не против, я думаю, это означает, что вы просто «тот парень» ... – user1166981

ответ

3

Это просто создаст сокет AF_INET (ipv4), который выполняет TCP. Как только вы вызываете connect, он будет привязан к порту, если это еще не сделано, через bind. Если вы хотите выбрать номер порта самостоятельно, просто bind вручную.

1

Используйте bind для управления местным портом, который вы используете. Вы также можете использовать его для выбора сетевого интерфейса.

Следующий код выбирает порт 12345 на все доступные интерфейсы

struct sockaddr_in addr; 
addr.sin_family = 2; 
addr.sin_addr.s_addr = INADDR_ANY; 
addr.in_port = htons(12345); 
int err = bind(socket, (struct sockaddr*)&addr, sizeof(addr)); 

Если вы не заботитесь, какой порт использовать, порт 0 рассматриваются как частный случай, когда сетевой стек выбирает (у) доступен port

+0

Таким образом, он использует локальный порт, и если сервер не разрешает использовать порты в определенном диапазон, он ищет свободный порт? – user1166981

+0

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

1

Только что созданный socket не указал адрес до вашего входа bind(), listen(), или connect() it.

Если вы хотите connect() или listen() на этом сокете, вам необязательно сначала связываться с адресом и портом; один будет автоматически назначен. Однако, если вы пытаетесь запустить сервер, к которому будут подключаться другие, вы, вероятно, захотите сначала указать bind() на известный адрес и порт. Иногда вы хотите подключиться к определенному адресу и порту, и здесь вы также должны сначала указать bind().

Если вы хотите найти адрес, к которому привязан существующий сокет, используйте getsockname().

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