0
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,所以我认为将整个设计更改为非阻塞模式有点困难。有什么办法可以防止阻塞发送功能?

提前致谢..

4

1 回答 1

3

如果您不想send阻塞,则需要非阻塞 I/O。没有办法解决这个问题。

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

从上面链接的手册页:

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

所以你可以将它与MSG_NOSIGNAL.

于 2011-08-04T10:59:14.910 回答