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 }
私はこのコードを持っていて、send関数は時々止まってしまいます。一部の人々は、非ブリンクI/Oを使用していることを指摘しています。私はepollを使用しているので、デザイン全体を非ブロックモードに変更するのは少し難しいと思います。送信機能をブロックしないようにする方法はありますか?このブロックの問題を解決するにはどうすればよいですか?
事前のおかげで..
私はすでにMSG_NOSIGNALを使用しています。 MSG_NOSIGNALとMSG_DONTWAITの両方を使用できますか?いくつかのサンプルコードを表示してください。あらかじめありがとうございます – codereviewanskquestions
リンク先のmanページを読んでください、それはその質問に答えます。あなたの好きな検索エンジン(またはこのサイトの検索機能)を使って、簡単に非ブロッキングコードのサンプルを見つけることができます。 – Mat