Вот то, что у меня есть (проверка на наличие ошибок):
struct sockaddr_in addr, ss, dest;
int port, s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
fcntl(s, F_SETFL, fcntl(s, F_GETFL, 0) | O_NONBLOCK);
memset((char*) &addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
inet_aton("127.0.0.1", &addr.sin_addr);
bind(s, (struct sockaddr*) &addr, sizeof(addr));
unsigned int len = sizeof(ss);
getsockname(s, (struct sockaddr*) &ss, &len);
port = ss.sin_port;
memset((char*) &dest, 0, sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons(port);
inet_aton("127.0.0.1", &dest.sin_addr);
sendto(s, "test", 5, 0, (struct sockaddr*) &dest, sizeof(dest));
char buf[5];
recv(s, buf, 5, 0);
Последнее предложение завершается с ошибкой Resource temporarily unavailable
(из-за флага O_NONBLOCK
).
Во фрагменте я разрешаю ОС привязывать произвольный порт, а затем получаю его с getsockname
.Если я вместо этого использую фиксированный порт и удаляю вызов на getsockname
, он работает.
PS: я на машине с linux.