###前提・実現したいこと
HTTP POSTで50Mbyteぐらいの文字列を受け取るサーバプログラムを作っています。
送信途中で切断された場合にタイムアウト処理を作るにあたり、select()の正しい使い方を知りたくて投稿しました。
###質問
HTTP POSTするデータサイズが大きく、何回かに分けてループでrecv()する場合に、"FD_ZERO, FD_SET, timevalへの時間の代入"はそれぞれselect()のたびに必要でしょうか
スクラッチですみませんが下記ソースコードのような処理を考えています。
select()のmanページを読んだ限り、"FD_ZERO, FD_SET, timevalへの時間の代入"はselect()を呼ぶ前に毎回必要なように読み取れたのですが、あっていますでしょうか?
受信処理を可能な限り早くしたいので、毎回呼ぶ必要がなければループの外に出したいと考えています。
###ソースコード
C
1int sockfd;/*接続済みSocket*/ 2char recvBuff[1024]; /*recv()用バッファ*/ 3long recvLen; /* recv()したサイズ */ 4char *body; 5 6fd_set rfds; 7struct timeval tv; 8int retval; 9 10/* HTTPヘッダまでの読み込みは完了しContent-Lengthを正しく取得できているとする */ 11body = (char *)calloc(Content-Length, sizeof(char)); 12 13for/* recv()文字数がContent-Lengthを超えるまでループ */ 14 15 FD_ZERO(&rfds); 16 FD_SET(sockfd, &rfds); 17 18 /* 5 秒間監視する。*/ 19 tv.tv_sec = 5; 20 tv.tv_usec = 0; 21 22 retval = select(sockfd+1, &rfds, NULL, NULL, &tv); 23 24 if(retval == -1) { 25 perror("select"); 26 break; 27 } else if(retval) { 28 recvLen = recv(sockfd, recvBuff, 1024, 0); 29 if(recvLen =< 0) { 30 /* エラー */ 31 break; 32 } else { 33 /* bodyにrecvBuffの内容をコピー */ 34 } 35 } else { 36 /* タイムアウト */ 37 break; 38 } 39} 40
###補足情報(言語/FW/ツール等のバージョンなど)

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/25 14:33