• ベストアンサー

ソケットプログラミングについて

こんにちは。 以前、この掲示板に質問させていただいた者です。 送信側から受信側へWinsockを利用し、jpeg,mpegファイルを送信したいのですが、プログラムを実行すると強制終了されてしまいます。以下に主要部分を記述します。 [送信側] FILE *fp; char fname[100]; printf("読み込み用ファイルを入力して下さい:"); scanf("%s",fname); if((fp = fopen(fname,"rb")) == NULL){ printf("入力ファイルをオープンできない。\n"); exit(1); } char send_buf[1025]; int nRet; int n; while(n = fread(send_buf,1,1024,fp) != -1){ sendto(theSocket,send_buf,n,0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); } fclose(fp); closesocket(theSocket); [受信側] FILE *fp; char fname[100]; printf("書き込み用ファイルを入力して下さい:"); scanf("%s",fname); if((fp = fopen(fname,"wb")) == NULL){ printf("出力ファイルをオープンできない。\n"); exit(1); } char Recv_buf[1025]; char size; SOCKADDR_IN saClient; while(1){ size = recvfrom(theSocket,Recv_buf,1024,0,(LPSOCKADDR)&saClient,&nLen); fwrite(Recv_buf,size,1,fp); } fclose(fp); closesocket(theSocket); 受信側を先に起動し、送信側を起動。送信側で1024バイトずつ送信し、受信側でwhileの無限ループを用いて送信側からのデータを受信するプログラムにしたつもりです。しかし、送信側で読み込みファイルを指定すると強制終了されてしまいます。ファイルオープンの仕方がおかしいのでしょうか?また、上記のプログラムでは1024バイトずつ送信できるようになっていますでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#30727
noname#30727
回答No.2

freadの戻り値を考えると、 while((n = fread(send_buf,1,1024,fp)) > 0){ などの方が良さそうです。 sendtoで1024バイト送ったからと言って、recvfromで1024バイトを1度で受け取れるとは限りません。細かく分割される事があります。 最初にファイルサイズを送れば、受信側はそのサイズに達するまで受け取り続けるだけですから、タイムアウト等は別問題としても、手順的には簡単になります。

bird_2005
質問者

お礼

書き込みありがとうございます。 この掲示板のC&C++に「Winsockを利用した単純なファイル送信プログラムについて」というタイトルで同様の内容を質問しています。 質問をしてから、自分の質問内容を読み返したところ記述の仕方が悪かったかな?と思ったためです。 また、ご教授お願いします。

その他の回答 (1)

  • nazo-nazo
  • ベストアンサー率39% (17/43)
回答No.1

主要以外部分も含めデバック作業をお勧めます。 while(n = fread(send_buf,1,1024,fp) != -1) ↓ while((n = fread(send_buf,1,1024,fp) )!= -1)

関連するQ&A