u_long has = 1;
ioctl(m_sock, FIONBIO , &has);
这个函数会非常无耻的返回你success,但是它实际上很可能什么也没做。
正确的做法应该是使用fcntl:
int flags = fcntl(m_sock, F_GETFL, 0);
fcntl(m_sock, F_SETFL, flags|O_NONBLOCK);
这真是一个隐蔽的问题,折腾了我两天。线程每每停留在send()调用那里,我始终没怀疑到:用ioctl设置FIONBIO成功之后,socket竟然还是阻塞的。
本文详细阐述了在处理socket非阻塞操作时,为何ioctl函数可能无法达到预期效果,并提供了正确的解决方案:使用fcntl函数进行更可靠的配置。通过对比两种方法在实践中的应用,揭示了隐藏的编程陷阱,帮助开发者避免长时间的调试困扰。

被折叠的 条评论
为什么被折叠?



