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フラグは呼び出しごとに使用できます。ただし、 /エラー コードを処理する必要があります。EAGAINEWOULDBLOCK

上記のリンクのマニュアルページから:

flags 引数は、次のフラグの 0 個以上のビットごとの OR です。

と組み合わせることができますMSG_NOSIGNAL

于 2011-08-04T10:59:14.910 に答える