Может ли TCP-сокет быть привязан к текущему используемому локальному адресу?Linux

Ответить Пред. темаСлед. тема
Anonymous
 Может ли TCP-сокет быть привязан к текущему используемому локальному адресу?

Сообщение Anonymous »

Я нашел следующий код:
int fd1 = socket(...);
bind(fd1, "0.0.0.0:0");
connect(fd1, addr1); // ------------ EINPROGRESS
addr = getsockname(fd1);

int fd2 = socket(...);
bind(fd2, addr);
connect(fd1, addr2); // ------------- EINPROGRESS

send(fd1, message); // --------------> OK


Все вызовы успешны, и я не могу понять, почему все еще используемый локальный адрес может быть привязан к fd2;
Разрешено ли это? Строка выглядит следующим образом:
socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_TCP) = 27
setsockopt(27, SOL_SOCKET, SO_REUSEPORT, [1], 4) = 0
setsockopt(27, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(27, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
connect(27, {sa_family=AF_INET, sin_port=htons(21116), sin_addr=inet_addr("192.168.3.47")}, 16) = -1 EINPROGRESS --------------------------- 1
getsockopt(27, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
setsockopt(27, SOL_TCP, TCP_NODELAY, [1], 4) = 0
getsockname(27, {sa_family=AF_INET, sin_port=htons(41473), sin_addr=inet_addr("192.168.3.47")}, [128->16]) = 0 ---------------------------- 2

socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_TCP) = 28
setsockopt(28, SOL_SOCKET, SO_REUSEPORT, [1], 4) = 0
setsockopt(28, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(28, {sa_family=AF_INET, sin_port=htons(41473), sin_addr=inet_addr("192.168.3.47")}, 16) = 0 ----------------------------------------- 3
connect(28, {sa_family=AF_INET, sin_port=htons(21117), sin_addr=inet_addr("192.168.3.47")}, 16) = -1 EINPROGRESS -------------------------- 4
getsockopt(28, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
setsockopt(28, SOL_TCP, TCP_NODELAY, [1], 4) = 0
getsockname(28, {sa_family=AF_INET, sin_port=htons(41473), sin_addr=inet_addr("192.168.3.47")}, [128->16]) = 0

epoll_ctl(12, EPOLL_CTL_DEL, 28, NULL) = 0
fcntl(28, F_GETFD) = 0x1 (flags FD_CLOEXEC)
close(28) = 0
sendto(27, "\304R/\n\v\236\332\346wXif\311_\375\1\22\t426463026\32\f192"..., 50, MSG_NOSIGNAL, NULL, 0) = 50 ------------------------------- 5


Подробнее здесь: https://stackoverflow.com/questions/792 ... al-address
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»