Чем accept () отличается от bind () и connect ()? - PullRequest
0 голосов
/ 30 апреля 2018

Рассмотрим следующий код для приема соединений:

struct sockaddr_in peer_addr;
socklen_t peer_addr_size = sizeof (struct sockaddr);
int peer_fd = accept(fd, (struct sockaddr *) &peer_addr, &peer_addr_size);

В accept(2) сказано:

Аргумент addrlen является аргументом значение-результат: вызывающий должен инициализировать его, чтобы он содержал размер (в байтах) структуры, на которую указывает addr; по возвращении он будет содержать фактический размер адреса пира.

С другой стороны, bind и connect не устанавливают размер структуры, на которую указывает addr:

struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(PORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bind(fd, (struct sockaddr *) &my_addr, sizeof (struct sockaddr));
struct sockaddr_in peer_addr;
peer_addr.sin_family = AF_INET;
peer_addr.sin_port = htons(PORT);
peer_addr.sin_addr.s_addr = inet_addr(ADDR);
connect(fd, (struct sockaddr *) &peer_addr, sizeof (struct sockaddr));

EDIT

Не ясно, в каких случаях может быть полезен «фактический размер адреса». Если «фактический размер адреса», полученный от партнера, каким-то образом полезен, то «фактический размер адреса» также должен быть полезен при получении с локального хоста. Тогда должен быть способ получить «фактический размер адреса» для struct sockaddr, который используется в connect и bind, потому что ни bind, ни connect этого не делают. Итак, как мы можем получить их в случаях, когда accept не используется? И почему bind и connect не устанавливают «фактический размер адреса».

ОС: Linux

1 Ответ

0 голосов
/ 30 апреля 2018

Параметр адреса - это выход в accept(), но вход в bind() и connect(). Поэтому и его, и связанный с ним параметр «значение-результат длины» необходимо записывать в accept(), а не в bind() и connect().

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