這裏接收UDP數據包是我迄今(剝離錯誤檢查):發送和從同一進程
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機器上。