LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 866|回复: 4

求助:为什么close(udp_socket)后,用netstat查看系统还在监听该端口?

[复制链接]
发表于 2007-3-27 18:06:32 | 显示全部楼层 |阅读模式
netstat

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address  ate                        
udp        0      0 0.0.0.0:53              0.0.0.0:*  


怎么才能让它立即消失???
发表于 2007-3-27 20:22:28 | 显示全部楼层
创建socket后设置端口复用:
  1. _msg = 1
  2. if (setsockopt (socket_fd, SOL_SOCKET, SO_REUSEADDR, &_msg, sizeof(int)) < 0)  perror (">>setsockopt");
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-27 20:29:10 | 显示全部楼层

看了一下,我的代码里已经有了这个选项了的

[PHP]
int listen_socket(uint32_t ip, int port, char *inf)
{
        struct ifreq interface;
        int fd;
        struct sockaddr_in addr;
        int n = 1;


        if ((fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
                return -1;
        }

        memset(&addr, 0, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(port);
        addr.sin_addr.s_addr = ip;

        if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == -1) {
                close(fd);
                return -1;
        }
        if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char *) &n, sizeof(n)) == -1) {
                close(fd);
                return -1;
        }

        strncpy(interface.ifr_name, inf, IFNAMSIZ);
        if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE,(char *)&interface, sizeof(interface)) < 0) {
                close(fd);
                return -1;
        }

        if (bind(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr)) == -1) {
                close(fd);
                return -1;
        }

        return fd;
}

[/PHP]
回复 支持 反对

使用道具 举报

发表于 2007-3-28 00:35:36 | 显示全部楼层
设置SOL_LINGER为熟悉的l_onoff为0
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-28 12:55:25 | 显示全部楼层
设置SOL_LINGER为l_onoff为0, 没有效果.

晕了.. 有人说close只是socket计数减一,但是我的socket在close以后计数业已经为0了.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表