Рассмотрим следующий код для приема соединений:
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