вопрос, связанный с сокетами в сетевом программировании на C - PullRequest
1 голос
/ 29 июня 2011

Системный вызов, известный как socket();, создает сокет на сервере прослушивания.Я хочу понять, что сервер создает комбинацию IP + порт.Допустим, telnet использует порт 23. Теперь, когда клиентские машины устанавливают соединения, то порт, на котором сервер прослушивает, тогда соединение отсутствует на порте 23, фактически оно находится на другом порту. Моя путаница также на стороне сервера.происходит ли то же самое.Например, я пишу сервер для прослушивания порта 23, а затем соединения, которые будут выполняться на стороне сервера с разными клиентами, как они различаются, потому что все они будут на одном и том же порту. Так как вы можете сделать так много соединений на одном сервереport.If кто-то использует telnet (23) или ftp (21) или ssh (22), тогда многие люди все еще могут войти в один и тот же сервисный порт на сервере, то есть более чем одно соединение для ssh разными пользователями, где ssh только слушаетв порту 22. Так, что именно делает сокет или как создается сокет?

ОБНОВЛЕНИЕ

Я получил то, что объяснено. В зависимости от комбинации IP + портас клиентского компьютера, на котором возникло соединение, остальные вещи со стороны сервера могут быть обработаны, и я думаю, что эта информация, вероятно, используется дескрипторами файлов сокетов.Что я вижу в системном вызове connect(), который мы используем следующим образом:

connect(sockfd,(struct sockaddr *)&client_address,size_t);

мы передаем struct sockaddr * на стороне клиента, который имеет уникальную комбинацию IP + порт, я думаю, когда сервер получает это в acceptтогда все продолжается.Далее я хочу узнать аргумент на стороне сервера

accept(server_sockfd,(struct sockaddr *)&client_address,(size_t *)sizeof (struct sockaddr ));

Получает ли он тот же самый client_address, который со стороны клиента был передан с помощью системного вызова connect ()?Если да, то socket_descriptors для одного и того же сервера, прослушивающего много клиентов, различны. Я хочу знать, как поддерживается структура данных на стороне сервера, когда он принимает запрос от клиента.

Ответы [ 3 ]

3 голосов
/ 29 июня 2011

TCP-соединения определяются 4 параметрами:

  • локальный IP
  • локальный порт
  • удаленный IP
  • удаленный порт

Таким образом, даже если два соединения используют один и тот же локальный IP-адрес и порт, ОС может различать их, поскольку удаленный IP-адрес и / или порт будут разными.

3 голосов
/ 29 июня 2011

Уникальная комбинация, которая идентифицирует соединение:

  • Адрес источника и порт
  • Адрес назначения и порт

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

Вот краткий tcpdump сеанс моего подключения моего рабочего стола к серверу через FTP (порт 21):

22:55:50.160704 IP 172.17.42.19.64619 > 172.17.42.1.21: S 2284409007:2284409007(0) win 8192 <mss 1460,nop,nop,sackOK>
22:55:50.160735 IP 172.17.42.1.21 > 172.17.42.19.64619: S 1222495721:1222495721(0) ack 2284409008 win 65535 <mss 1460,sackOK,eol>
22:55:50.160827 IP 172.17.42.19.64619 > 172.17.42.1.21: . ack 1 win 8192
22:55:50.162991 IP 172.17.42.1.21 > 172.17.42.19.64619: P 1:61(60) ack 1 win 65535
22:55:50.369860 IP 172.17.42.19.64619 > 172.17.42.1.21: . ack 61 win 8132
22:55:56.288779 IP 172.17.42.19.64620 > 172.17.42.1.21: S 3841819536:3841819536(0) win 8192 <mss 1460,nop,nop,sackOK>
22:55:56.288811 IP 172.17.42.1.21 > 172.17.42.19.64620: S 454286057:454286057(0) ack 3841819537 win 65535 <mss 1460,sackOK,eol>
22:55:56.288923 IP 172.17.42.19.64620 > 172.17.42.1.21: . ack 1 win 8192
22:55:56.290224 IP 172.17.42.1.21 > 172.17.42.19.64620: P 1:61(60) ack 1 win 65535
22:55:56.488239 IP 172.17.42.19.64620 > 172.17.42.1.21: . ack 61 win 8132
22:56:03.301421 IP 172.17.42.19.64619 > 172.17.42.1.21: P 1:12(11) ack 61 win 8132
22:56:03.306994 IP 172.17.42.1.21 > 172.17.42.19.64619: P 61:94(33) ack 12 win 65535
22:56:03.510663 IP 172.17.42.19.64619 > 172.17.42.1.21: . ack 94 win 8099
22:56:06.525348 IP 172.17.42.19.64620 > 172.17.42.1.21: P 1:12(11) ack 61 win 8132
22:56:06.526332 IP 172.17.42.1.21 > 172.17.42.19.64620: P 61:94(33) ack 12 win 65535
22:56:06.726857 IP 172.17.42.19.64620 > 172.17.42.1.21: . ack 94 win 8099

Вы можете видеть начальное соединение 172.17.42.19.64619 <-> 172.17.42.1.21. Порт 64619 - это то, что окно Windows 7 выбрало в качестве порта источника, когда оно установило исходящее соединение. Две строки с S - это пакеты SYN, идущие туда и обратно для установления соединения. Затем я запускаю следующее соединение, и Windows просто использует следующий доступный порт, 64620. Соединение 172.17.42.19.64620 <-> 172.17.42.1.21 образует новый уникальный набор элементов, которые я перечислил вверху. Только порт клиента отличается, но этого достаточно. Каждый пакет, который поступает на сервер в порт 21, может различаться по порту источника. Каждый пакет с порта 21 на сервере, прибывающем к клиенту, можно отличить по порту назначения.

0 голосов
/ 29 июня 2011

Я объясню вам псевдокод из Qt. Все TCP-серверы работают одинаково.

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

tcpServer.listen(LocalHost, PORT);

connect(&tcpServer, SIGNAL(newConnection()),this, SLOT(NewConnection()));

//Callback that is called when server accepts a new connection
void NewConnection()
{

   //Here you will have a new socket for communication with the client
   //The tcpServer will continue listening to given port 

   QTcpSocket* connection = tcpServer.NextPendingConnection();

   //Use your new connection to communicate with the remote client...

}

Надеюсь, это поможет

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