каков номер порта хоста, когда мы используем accept () и connect () в программировании сокетов на C

#c #sockets

#c #сокеты

Вопрос:

в руководстве Beej по сетевому программированию accept() объясняется следующим образом:

Что произойдет, так это то, что кто-то далеко-далеко попытается подключиться () к вашей машине через порт, который вы прослушиваете (). Их соединение будет помещено в очередь, ожидающую редактирования accept (). Вы вызываете accept () и сообщаете ему, чтобы он получил ожидающее соединение. Это вернет вам совершенно новый дескриптор файла сокета для использования для этого единственного соединения!

но как мы узнаем номер порта «совершенно нового сокета»?

Ответ №1:

Передайте accepted SOCKET в getsockname() , чтобы восстановить его локальный IP / порт, и в getpeername() , чтобы восстановить его удаленный IP / порт.

Комментарии:

1. спасибо, я попробовал getsockname(). Но, похоже, порт «совершенно нового сокета» такой же, как порт исходного прослушивающего сокета. Вы знаете, почему это так?

2. @zwx Вот как работают сокеты, ориентированные на подключение. Локальный порт — это тот, к которому подключен клиент, и это ваш порт «сервера».

Ответ №2:

Я думаю, что getpeername вернет эту информацию

Ответ №3:

Из документации GNU по accept.

                 newfd = accept (sockfd, (struct sockaddr *) amp;clientname, amp;size);
                if (newfd < 0) {
                    perror ("accept");
                    exit (EXIT_FAILURE);
                }
  

В accept sockaddr.in struct, вы находите локальный порт.

                 fprintf (stderr, "Server: connect from host %s, port %hd.n",
                    inet_ntoa (clientname.sin_addr),
                    ntohs (clientname.sin_port));
  

Ответ №4:

Он не назначает новый порт. Принятый сокет использует тот же порт, что и прослушивающий сокет.