- 締切済み
VC++でのメールの添付ファイル受信
http://www.masukawa.co.jp/sdk/40.html のサイトを参考にしてソースを組んでいます。 ですが BOOL Pop3RecvDataToFile(SOCKET sock, int i, char *filename) { char *get, tmp, buff[BUFF_SIZE]; int size, pos; FILE *fp; if (!SockCmd1(sock, "RETR %d", i, buff, "+OK")) return FALSE; if ((fp = fopen(filename, "wb")) == NULL) return FALSE; tmp = '\0'; pos = 0; for (;;) { size = recv(sock, buff, BUFF_SIZE, 0); for (get=buff; get<(buff+size); get++) { if (*get=='\0' || *get=='\r') continue; if (++pos == 1) { if (*get != '\n') { tmp = *get; continue; } } else if (pos == 2) { if (tmp=='.' && *get=='\n') goto FINISH; if (tmp!='.' || *get!='.') fputc(tmp, fp); } fputc(*get, fp); if (*get == '\n') pos = 0; } } FINISH: fclose(fp); return TRUE; } のfor分で無限ループしています。 その理由がわかりません。どうすればよいでしょうか?
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Wr5
- ベストアンサー率53% (2173/4061)
無限ループするのはそのように作られているから。 というのもありますが…受信データがちゃんと取れているのか…ってのもありますかね。 途中で接続が切断されたりすると戻ってこなさそうですねぇ。 切断されてrecv()が0を返す=>受信データ検索のループが素通り=>recv()でブロック…する?? recv()でブロックしないと…SOCKET_ERRORが返される=>受信データ検索のループが素通り=>recv()でSOCKET_ERRORが返される=>受信データ検索のループが素通り=>recv()でSOCKET_ERRORが返される=>受信データ検索のループが素通り=>recv()でSOCKET_ERRORが返される………ひゃっほ~い!! とりあえずステップ実行するなりしてrecv()の戻り値と受信データ確認してみますかね。 私なら。 http://www.masukawa.co.jp/sdk/39.html も見ると… >if (!SockCmd1(sock, "RETR %d", i, buff, "+OK")) return FALSE; でメール本体を受信して完了している可能性もありますねぇ…。 # SockRecvLine()のrecv()でコマンド応答の1行よりも多く引き取って…捨ててる。 あと…メールチェッカー作っていた時の経験から… 1行の改行を"\r\n\n"で送ってきてくれたspam配信ソフトが存在していた…ということも付け加えておきます。 # もちろん、サーバからの応答は普通に"\r\n"でした。
- TooManyBugs
- ベストアンサー率27% (1472/5321)
>その理由がわかりません。 プログラムが無限ループするようになっているから。 >どうすればよいでしょうか? プログラムを修正するか諦める。