所以我完全失去了它,当有人使用select()像我展示了一些代码:SOCKET文件描述
FD_ZERO(&readfds);
FD_SET(socket,&readfds);
FD_SET(0,&readfds);
.......// bind() and listen(),regular stuff
// Before select(),this guy cleared readfds to null and sort of start all over again
FD_ZERO(&readfds);// Behold,this is exactly the line confusing myself
FD_SET(socket,&readfds);
// select will be called in the future within a infinite loop
所以基本上说什么FD_ZERO
绑定后,听是由于某种原因,明确以前的内容,并插入插座文件描述符再次设置为fd。同时,在fd集中,0描述符(标准输入)显然消失。
谁能解释这件事?我不觉得这是正确的,但我不能真正弄清楚。也许再次设置一些特定的FD设置是一种实际的机制...
我认为bind()
和listen()
可以修改fd集以某种方式。我设置了几个断点,并检查输出。随后,FD集没有改变。
UPDATE:
真正让我困惑的是第二FD_ZERO(&readfds)
。 显然,第一个就像在缓冲区中清理生锈的东西。在每次迭代中,我们必须将fdset清除为未来的默认值。我只是不理解第二个。要么是错误的,要么不会伤害到任何人。
'select'会改变fdset,但'bind'和'listen'不能,它们甚至没有指向它的指针。但是请自己帮忙,并使用像'poll'或'epoll'这样的现代API,并且不要再担心fdset。 – 2012-02-23 03:18:23
听起来很酷,但我不能得到它 – jasonkim 2012-02-23 03:20:57
使用'民意测验'。它现代,便携和快速。 'epoll'仅用于基准自我愉悦,它擅长的基准测试不符合大多数真实世界的使用需求(其中'epoll'实际上比'poll'慢得多)。 – 2012-02-23 03:50:41