2011-08-04 13 views
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を使用しているので、デザイン全体を非ブロックモードに変更するのは少し難しいと思います。送信機能をブロックしないようにする方法はありますか?このブロックの問題を解決するにはどうすればよいですか?

事前のおかげで..

答えて

3

あなたはsendをブロックしたくない場合は、あなたは、ノンブロッキングI/Oが必要になります。その周りに方法はありません。

ソケットを非ブロッキングモードにする必要はありませんが、MSG_DONTWAITフラグはコール単位で使用できます。しかし、あなたはEAGAIN/EWOULDBLOCKエラーコードと対処する必要があります。 manページから

は、上記のリンク:

flags引数には、以下のフラグのゼロ個以上のビット単位です。

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

+0

私はすでにMSG_NOSIGNALを使用しています。 MSG_NOSIGNALとMSG_DONTWAITの両方を使用できますか?いくつかのサンプルコードを表示してください。あらかじめありがとうございます – codereviewanskquestions

+0

リンク先のmanページを読んでください、それはその質問に答えます。あなたの好きな検索エンジン(またはこのサイトの検索機能)を使っ​​て、簡単に非ブロッキングコードのサンプルを見つけることができます。 – Mat

関連する問題