读书人

UDP socket errno 111,该如何处理

发布时间: 2012-12-26 14:39:29 作者: rapoo

UDP socket errno 111
很简单的一个UDP程序,向一个没有打开的端口发送消息。Wireshark抓包发现有趣现象

第一次UDP数据发出,对方回ICMP 端口不可达
第二次没有UDP发出,write函数置errno
第三次UDP数据发出,对方回ICMP 端口不可达
第四次没有UDP发出,write函数置errno
如此循环。。。。
就算在第一、第二次之间,对端端口打开,依然发送失败

我现在就希望程序每次都发出UDP包。前提是使用同一个socket,发送期间不close(socket)

C/C++ code
#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;}

读书人网 >C语言

热点推荐