当前位置:  开发笔记 > 运维 > 正文

套接字关闭时,UDP套接字上的select不会结束 - 我做错了什么?

如何解决《套接字关闭时,UDP套接字上的select不会结束-我做错了什么?》经验,为你挑选了0个好方法。

我正在研究Linux系统(具有2.6.20内核的Ubuntu 7.04服务器).

我有一个程序,它有一个线程(thread1)等待选择一个UDP套接字变得可读.我正在使用select(使用我的套接字作为单个readfd和单个exceptfd)而不是仅仅调用recvfrom,因为我想要超时.

从另一个线程,我关闭并关闭套接字.如果我在recvfrom中阻塞thread1时执行此操作,则recvfrom将立即终止.如果我执行此操作而thread1在超时的select中被阻止,则select不会立即终止,但最终会正常超时.

任何人都可以告诉我为什么选择不会在套接字关闭后立即退出?这不是一个例外吗?我可以看到它不可读的地方(很明显),但它已经关闭,这似乎是例外的.

这是套接字的开头(为了简单起见,删除了所有错误处理):

m_sockfd = socket(PF_INET, SOCK_DGRAM, 0);
struct sockaddr_in si_me;
memset((char *) &si_me, 0, sizeof(si_me));
si_me.sin_family = AF_INET;
si_me.sin_port = htons(port);
si_me.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(m_sockfd, (struct sockaddr *)(&si_me), sizeof(si_me)) < 0)
{
// deal with error
}

这是thread1执行的select语句:

struct timeval to;
to.tv_sec = timeout_ms/1000;// just the seconds portion
to.tv_usec = (timeout_ms%1000)*1000;// just the milliseconds 
                                    // converted to microseconds

// watch our one fd for readability or
// exceptions.
fd_set  readfds, exceptfds;
FD_ZERO(&readfds);
FD_SET(m_sockfd, &readfds);
FD_ZERO(&exceptfds);
FD_SET(m_sockfd, &exceptfds);

int nsel = select(m_sockfd+1, &readfds, NULL, &exceptfds, &to);

更新:显然(如下所述),关闭套接字不是一个例外情况(从选择的角度来看).我想我需要知道的是:为什么?而且,这是故意的吗?

我真的想要了解这种选择行为背后的想法,因为这似乎与我的期望背道而驰.因此,我显然需要调整我对TCP堆栈如何工作的思考.请向我解释一下.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有