【问题标题】:How do I fix this blocking issue?如何解决此阻塞问题?
【发布时间】:2011-08-04 10:51:55
【问题描述】:
119             while(remainLength > 0){
120                if(remainLength >= MAX_LENGTH){
121                   log("WorkHandler::workLoop, remain %d > max %d \n", remainLength, MAX_LENGTH);
122                   currentSentLength = send(client->getFd(), sBuffer, MAX_LENGTH, MSG_NOSIGNAL);
123                   log("currentSentLength %d \n", currentSentLength);
124                }
125                else{
126                   log("WorkHandler::workLoop, remain %d < max %d \n", remainLength, MAX_LENGTH);
127                   currentSentLength = send(client->getFd(), sBuffer, remainLength, MSG_NOSIGNAL);
128                   log("currentSentLength %d \n", currentSentLength);
129                }
130
131
132                if(currentSentLength == -1){
133                   log("WorkHandler::workLoop, connection has been lost \n");
134                   break;
135                }
136                sBuffer += currentSentLength;
137                log("sBuffer %d\n", sBuffer);
138
139                remainLength -= currentSentLength;
140                log("remainLength %d \n", remainLength);
141
142             }

我有这段代码,但发送功能有时会卡住。有人指出使用非阻塞 I/O。我正在使用 epoll,所以我认为将整个设计更改为非阻塞模式有点困难。有什么办法可以防止阻塞发送功能?

提前谢谢..

【问题讨论】:

    标签: c++ linux network-programming epoll


    【解决方案1】:

    如果您不希望 send 阻塞,则需要非阻塞 I/O。没有办法。

    您不必将套接字置于非阻塞模式,MSG_DONTWAIT 标志可以在每次调用的基础上使用。但是您需要处理EAGAIN/EWOULDBLOCK 错误代码。

    来自上面链接的手册页:

    flags 参数是以下零个或多个标志的按位或。

    所以你可以将它与MSG_NOSIGNAL结合起来。

    【讨论】:

    • 我已经在使用 MSG_NOSIGNAL。我可以同时使用 MSG_NOSIGNAL 和 MSG_DONTWAIT 吗?你能展示一些示例代码吗?提前致谢
    • 请阅读链接的手册页,它回答了这个问题。您可以使用自己喜欢的搜索引擎(或本网站的搜索功能)轻松找到示例非阻塞代码。
    猜你喜欢
    • 2016-06-11
    • 2021-08-05
    • 2019-08-05
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    相关资源
    最近更新 更多