【问题标题】:recv from epolled, nonblocking socket in edge-triggered mode边缘触发模式下来自 epolled、非阻塞套接字的 recv
【发布时间】:2010-11-23 13:41:40
【问题描述】:

谁能给我一个来自epolled 的recv 的示例,边缘触发模式下的非阻塞套接字?我问是因为我有一些麻烦。

【问题讨论】:

    标签: c sockets nonblocking epoll


    【解决方案1】:

    EPOLLET 设置的手册页有:

    将 epoll 用作边缘触发 ( EPOLLET ) 接口的建议方法如下,以及避免遵循的可能陷阱。

    i 
    with non-blocking file descriptors 
    ii 
    by going to wait for an event only after read(2) or write(2)
    return EAGAIN
    

    编辑: 您也可以调用 recv() 或 read() 获取 x 个字节,直到收到少于 x 个字节。

    如果您不这样做,您可能会造成数据保留在套接字缓冲区中并阻止套接字上的 ET 活动的饥饿情况。

    你有什么问题?

    【讨论】:

    • 我将它与非阻塞套接字一起使用并在 EAGAIN 时读取,例如:do { n = recv(sock, temp, sizeof(temp), 0); } while (errno == EAGAIN);但是,有时程序会陷入无限循环,并且 errno == ENOTCONN
    • 你的意思是:errno=0; do{ recv here} while(errno!=EAGAIN)
    • recv() 返回> 0 时,您实际上应该循环。如果返回-1,则查看errno - 如果是EAGAIN,则返回轮询,否则处理错误(关闭套接字等)
    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2023-03-03
    • 2010-10-29
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多