UDP socket errno 111
很简单的一个UDP程序,向一个没有打开的端口发送消息。Wireshark抓包发现有趣现象
第一次UDP数据发出,对方回ICMP 端口不可达
第二次没有UDP发出,write函数置errno
第三次UDP数据发出,对方回ICMP 端口不可达
第四次没有UDP发出,write函数置errno
如此循环。。。。
就算在第一、第二次之间,对端端口打开,依然发送失败
我现在就希望程序每次都发出UDP包。前提是使用同一个socket,发送期间不close(socket)
#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <arpa/inet.h>#include <linux/un.h>#include <errno.h>int main(void){ int sock_fd = 0; struct sockaddr_in addr = {0}; char buffer[32] = "abcdefghijklmn"; sock_fd = socket(PF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(10566); inet_pton(AF_INET, "172.21.22.12", &addr.sin_addr); connect(sock_fd, (struct sockaddr *)&addr, sizeof(addr)); if (-1 == write(sock_fd, buffer, sizeof(buffer))) { fprintf(stderr, "write failed: %d %s\n", errno, strerror(errno)); } sleep(1); if (-1 == write(sock_fd, buffer, sizeof(buffer))) { /* Error: 111 Connection refused */ fprintf(stderr, "write failed: %d %s\n", errno, strerror(errno)); } sleep(1); if (-1 == write(sock_fd, buffer, sizeof(buffer))) { fprintf(stderr, "write failed: %d %s\n", errno, strerror(errno)); } sleep(1); if (-1 == write(sock_fd, buffer, sizeof(buffer))) { /* Error: 111 Connection refused */ fprintf(stderr, "write failed: %d %s\n", errno, strerror(errno)); } sleep(1); if (-1 == write(sock_fd, buffer, sizeof(buffer))) { fprintf(stderr, "write failed: %d %s\n", errno, strerror(errno)); } close(sock_fd); return 0;}