【问题标题】:socket in blocking mode阻塞模式下的套接字
【发布时间】:2012-02-15 16:17:38
【问题描述】:

您认为将 select() 与阻塞套接字一起使用是个好主意还是更好地使用超时 SO_SNDTIMEO/SO_RCVTIMEO

(我在Linux下,socket设置在SOCK_STREAM上)

第一个解决方案的优点是它可以与任何类型的套接字一起使用(阻塞和/或非阻塞状态)

【问题讨论】:

  • Stef - 你能详细说明一下细节吗? Linux 还是 Windows? SOCK_STREAM 还是 SOCK_DGRAM?

标签: sockets network-programming timeout blocking nonblocking


【解决方案1】:

假设你想跟进select()read()/write()/send()/etc.. 当它返回就绪条件时,如果你的文件描述符处于阻塞模式,你当然必须非常小心。对于读取,您必须确保在获得读取就绪指示后只读取一次,因为第二次可能会阻塞。对于写入,情况可能更糟:我想可能存在一些模糊的情况,在这种情况下,select() 报告套接字已准备好,但发生了一些事情,并且在您 write() 时它已不再准备就绪。即使最后一个假设过于悲观,我也会认为这种解决方案是不可维护的,也是不好的做法。

考虑到使用fcntl() 将文件描述符从阻塞动态切换到非阻塞再切换回来并不困难,您是否如此担心与阻塞套接字兼容?只需将它们更改为非阻塞即可。

【讨论】:

    猜你喜欢
    • 2011-12-18
    • 1970-01-01
    • 2010-10-31
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多