Winsockを利用した単純なファイル送信プログラムについて

このQ&Aのポイント
  • Winsockを使用したUDPを利用した単純なファイル送信プログラムの概要と内容について
  • 送信側からのファイル送信が正常に行われない原因を特定するため、WinsockのUDPを用いた単純なファイル送信プログラムを作成したいと考えています
  • 詳細なプログラムの内容としては、送信側ではファイルポインタを使用してファイルをオープンし、fread関数とsendto関数を用いて1024バイトずつ送信します。一方、受信側では無限ループ内でrecvfrom関数とfwrite関数を用いて送信側からのデータを受信し、ファイルに書き込みます。
回答を見る
  • ベストアンサー

Winsockを利用した単純なファイル送信プログラムについて

こんばんは。 何度もこの掲示板を利用させていただいている者です。 WinsockのUDPを用いて簡単なファイル送信プログラムを作っています。UDPを使わずに、TCPを使用したほうが良いのでは?とのご指摘をいただきましたが、まずは、UDPを利用した単純なファイル送信プログラムを作ってみたいと思っています。 しかし、送信側から受信側へファイルがうまく受信できていません。もしかしたら、送信側自体がきちんと送信できていないのかもしれません。 以下にそのプログラムの概要と内容を示します。 [概要] 送信側→受信側にUDPを用いて、送信側にあるjpegまたはmpegファイルを送信し、受信側でファイルを開く。 [プログラム概要] ・送信側 ファイルポインタを用いてファイルオープン fread関数とsendto関数を用いて1024バイトずつ送信 ・受信側 ファイルポインタを用いてファイルオープン whileの無限ループ内に、recvfrom関数とfwrite関数を用いて送信側からのデータを受信 [プログラムの内容] ・送信側 printf("読み込み用ファイルを入力して下さい:"); scanf("%s",fname); if((fp = fopen(fname,"rb")) == NULL){ printf("入力ファイルをオープンできない。\n"); exit(1); } char send_buf[1025]; int n; while(n = fread(send_buf,1,1024,fp) != -1){ sendto(theSocket,send_buf,n,0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); } ・受信側 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); } ご指摘またはご教授をいただけたらと思います。 よろしくお願いします。

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

while(n = fread(send_buf,1,1024,fp) != -1){ ですが、freadはファイル終了時、0を返します。 -1が返ることはありません。 while((n = fread(send_buf,1,1024,fp)) != 0){ としてください。 #3のかたの指摘は、自分で考えるとして、 とりあえず、上記のようにしてください。 また、 while()} sendto()... } のなかで、nの値を印字してみては、いかがですか。 そうすれば、何文字読めているかも確認できます。

bird_2005
質問者

補足

書き込みありがとうございます。 <引用文> while()} sendto()... } のなかで、nの値を印字してみては、いかがですか。 そうすれば、何文字読めているかも確認できます。 ------------------------------------------------- そこで以下のように記述してみました。 [送信側] char send_buf[1025]; char send[4] = "end"; int n; int Num_n = 0; while((n = fread(send_buf,1,1024,fp)) != 0){ Num_n++; printf("n:%s\t",send_buf); sendto(theSocket,send_buf,n,0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); } printf("nの数:%d\n",Num_n); sendto(theSocket,send,strlen("end"),0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); [受信側] 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); //エラーではじかれる部分 if(!strcmp(size,"end")) break; } printf("ファイル受信完了\n"); 送信側PCに、 printf("n:%s\t",send_buf) にて、画面出力させたところテキストファイル内の文字列が表示されました。 次の問題なのですが、 送信側のwhileループから抜けた時点で「end」を送信し、受信側で「end」を受信したら無限ループから抜けるようにしてみたのですが、受信側の記述方法が分かりません。 上記の受信側プログラムに if(!strcmp(size,"end")) break; と記述したのですが、エラーのためできませんでした。 よろしくお願いします。

その他の回答 (6)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.7

>ワイヤレス環境下であり、かつUDPを使用しているため、パケットが送信側から受信側へ行く途中でロスしてしまっているのだと思っています・・・・。 >大変勉強になっているのですが、ロス率をできるだけ回避する方法とかあるのでしょうか? UDPはもともとロスすることを前提としたプロトコルなので、やむを得ないと考えます。これを避けるには、TCP/IPにより、送受信を行う方法しかありません。 UPDを使用し、かつロスしない仕組みをアプリケーションで作るなら、以下のようになります。(1つの例として) 1)送り側は、データの先頭にデータの番号を付加して送ります。データの番号は、int型整数(4バイト)が、妥当でしょう。これを1からの連番で、送ります。 2)受信側は、この番号を監視します。従って、純粋なデータは、受信したものから、この番号を削除したものになります。 3)受信側では、データを受信する都度、受信した証として、この番号を送信元へ送ります。 4)送信側は、自分が送った番号が、受信側から戻ったことを確認して、次のデータを送ります。 上記のように、UDPでデータのロストを防ぐためには、大変な労力が発生します。もともと、ロストしても良い場合に、UDPを使用します。従って、他の方も言われてますように、TCP/IPで送信を行うのが、最も現実的な解決の方法になります。

bird_2005
質問者

お礼

いろいろ教えてくださり、ありがとうございました。 大変勉強になりました。 これからもプログラミング、ネットワークの学習に精を出していきたいと思っています。 また質問したときには、よろしくお願いします。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.6

>3Mバイト程度のmpegファイルまたは、150Kバイト程度のjpegファイルを送信してみたところ、送信はできていると思うのですが、うまく受信できません。 どのように、うまくできていないのですか? 1)「データ受信しました」は、受信側で表示されましたか? 2)「データ受信しました」は、送信側で表示されましたか?(データ送信しましたの間違い?) 3)受信側でファイルに書いた内容と、送信側のファイルの内容は一致していますか?

bird_2005
質問者

補足

書き込みありがとうございます。 <引用文> 1)「データ受信しました」は、受信側で表示されましたか? 2)「データ受信しました」は、送信側で表示されましたか?(データ送信しましたの間違い?) 3)受信側でファイルに書いた内容と、送信側のファイルの内容は一致していますか? 申し訳ありません。きちんと、送信データを受信することができました。受信側の「データ受信しました」もきちんと表示されました。 ありがとうございました。 実は、今まで、一台の端末で送信側と受信側のプログラムを走らせてデータ送信と受信を確かめていました。 さきほど端末2台を用いて、ワイヤレス環境下でのアドホック通信を試みたところ、3Mバイトのmpegファイルを送信したところ、受信側では1Mバイト程度のファイルになっていました。また、jpegファイルのファイル容量によって、受信側の「データ受信しました」が表示されず「Ctrl + C」にて強制終了しています。 ワイヤレス環境下であり、かつUDPを使用しているため、パケットが送信側から受信側へ行く途中でロスしてしまっているのだと思っています・・・・。 大変勉強になっているのですが、ロス率をできるだけ回避する方法とかあるのでしょうか? たびたびすみません。 よろしくおねがいします。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.5

受信側ですが、 char size;を int size;にしてください。char型では127バイトまでしか、対応できません。(300バイトがくると、動作がおかしくなります) 問題の場所を、以下のようにしてください。 if (size == 3){ if (memcmp(Recv_buf,"end",3) == 0) break; } とします。 これは、受信したサイズが3バイトかつ、受信した文字が "end"ならbreakするという意味です。 recvfromの戻り値は、受信したデータではなく、受信したデータのサイズですから、その点を間違えないでください。

bird_2005
質問者

補足

書き込みありがとうございます。 ご提示して下さいました、プログラムを以下の場所に挿入したところ、テキストファイルを送信側から受信側へと送信することができました。 ありがとうございます。 また質問なのですが、 3Mバイト程度のmpegファイルまたは、150Kバイト程度のjpegファイルを送信してみたところ、送信はできていると思うのですが、うまく受信できません。ファイルの最後を意味するために付け加えた「end」では、mpegやjpegファイルに対しては効果がないのでしょうか? [送信側] char send_buf[1025]; char send[4]; int n; int Num_n = 0; strcpy(send, "end"); while((n = fread(send_buf,1,1024,fp)) != 0){ Num_n++; printf("n:%dバイト\t",n); sendto(theSocket,send_buf,n,0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); } printf("nの数:%d\n",Num_n); sendto(theSocket,send,strlen(send),0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); printf("データ受信しました\n"); fclose(fp); closesocket(theSocket); [受信側] char Recv_buf[1025]; int size; SOCKADDR_IN saClient; while(1){ size = recvfrom(theSocket,Recv_buf,1024,0,(LPSOCKADDR)&saClient,&nLen); fwrite(Recv_buf,size,1,fp); if (size == 3){ if (memcmp(Recv_buf,"end",3) == 0) break; } } printf("データ受信しました\n"); fclose(fp); closesocket(theSocket); よい方法がありましたら、教えていただけないでしょうか?よろしくお願いします。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.3

あなたはネットワーク以前にC言語の文法を一からやり直した方が良い。 > while(n = fread(send_buf,1,1024,fp) != -1){ この行を実行したとき、読込みに成功すると何文字読み込んだかによらずnは1になる。何故そうなるのかは自分で良く文を読み返して確認し理解すること。

bird_2005
質問者

お礼

書き込みありがとうございます。 また、よろしくお願いします。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

では、ファイルを読み込んで送信するのを止めて、単純にsendtoを行うだけにしてテストしてみてください。1回のsendtoだけなら成功しますか? ・・・というふうに、単純なものから順番に調べていくのが、普通の調べ方です。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

1. どのように、うまく受信できていないのですか。ある程度のデータは受信側に届いているのですか、それとも何も届いていないのですか。送信側は正常終了するのですか、何かエラーが発生するのですか。 2. 一度に送信するデータの量を128バイトに減らすと、状況はどう変わりますか。

bird_2005
質問者

補足

書き込みありがとうございます。 >1. どのように、うまく受信できていないのですか。 ある程度のデータは受信側に届いているのですか、それとも何も届いていないのですか。送信側は正常終了するのですか、何かエラーが発生するのですか。 「hoge」と記述したテキストファイルを送ってみたところ、受信側では、「hoge」の頭文字である「h」がたくさん表示されます。 送信側は、while(n = fread(send_buf,1,128,fp) != -1)から抜けると「データ送信しました」と表示するようにしましたが、表示されません。そこで「ctrl + C」で強制的に終了しています。また、受信側も同様に強制終了しています。 2.128バイトに減らしても1の内容と変わりませんでした。 よろしくお願いします。

関連するQ&A

  • 配列とポインタについて

    こんばんわ。 WinSockを利用してネットワークプログラミングを行っています。 以下のようなプログラムを作成したのですが、実行できません。 以下のプログラムは質問箇所を抜き出したものです。 [プログラム] int Receive(u_short portNo) { char recv_Buf[1025],recv_Buff[1025]; size = recvfrom(s2, recv_Buf, (int)sizeof(recv_Buf) - 1, 0, (SOCKADDR *)&from, &fromlen); recv_Buff = recv_Buf; Sender(portNo,szServer,recv_Buff); } int Send(unsigned short portNo,char *szServer,char *recv_Buff) { sendto(s1, recv_Buff, (int)strlen(recv_Buff), 0, (LPSOCKADDR)&addrin1, sizeof(addrin1)); } このプログラムは、Receive関数内のrecvfrom関数で1024Byte(recv_Buf[1025])受信したデータをSend関数内のsendto関数で送信するというプログラムです。 recv_Buf = recv_Buffにてエラーが発生します。なにか解決策はりますでしょうか? また、Receive関数およびSend関数は何回も呼ばれるのですが、配列は初期化する必要があるのでしょうか? よろしくお願いします。

  • 抜け落ちている番号を取得する方法(Winsock利用)

    こんにちは。 A→Bというように、 送信端末Aから受信端末Bへパケットを送信する際に、sprintf関数を用いて、各送信パケットに対してナンバリングを行っています。 そして、受信端末において取得することができた番号と抜け落ちている番号を取得したいと思っています。 以下に、プログラムの概要を示します。 [送信側] char send_Buff[1500]; int sequence_Num = 0; //シーケンス番号のカウントアップ sequence_Num++; //sprintf関数にて、文字列格納 sprintf(send_Buff,"%d\0",sequence_Num); sendto関数を使用し、送信 [受信側] recv_Buf[1500]; int x; unsigned int count = 0; recvfrom関数にて送信端末からのパケットを受信し、recv_Bufに格納 count++; //recv_Bufの先頭要素からナル文字までを走査し、ナル文字をみつけたらナル文字の手前の要素までをreceive_seq_Numに格納 for(x=0;recv_Buf[x]!='\0';x++){  receive_seq_Num[count][x] = recv_Buf[x]; } 上記プログラムのように、記述したのですが・・・ [分からない点] 受信側にて、受信することができた各パケットのシーケンス番号のみを配列内に格納したいのですが、上記の記述方法で可能でしょうか? また、配列内に格納したシーケンス番号から抜け落ちているシーケンス番号を割り出したいのですが、どのような記述方法がありますでしょうか? 受信シーケンス番号;1,2,3,4,5,7,10,11,20,21,22・・・ 抜け落ちているシーケンス番号:6,8,9,12,13,14,15,16,17,18,19 ということです。 よろしくお願いします。

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

    こんにちは。 以前、この掲示板に質問させていただいた者です。 送信側から受信側へ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バイトずつ送信できるようになっていますでしょうか? よろしくお願いします。

  • ファイルの受信

    c言語で、クライアント側のファイルを開き、内容をそのまま送信しているはずなのですが上手くいきません。 テキストファイルは正しく送れるようですが、他の実行ファイルなどはダメみたいです。 送信側は、"rb"でオープンし,whileで fread(send_buf,1024,1,fp); send(soc,send_buf,strlen(send_buf),0); を繰り返しています。send_buf[1025]です。 送信側は Recv_buf[1025];で size = recv(soc,Recv_buf,1024,0); fwrite(Recv_buf,size,1,fp); whileで繰り返し受信がなくなったらselectでタイムアウトしています。 いろいろ調べたのですがSleepが必要らしいそうですが・・・どうなんでしょう?

  • ソケットプログラミングによるファイル送信について

    VC++.NETを利用して、Winsockにてファイル送信プログラムを作成しています。ソケットはUDPを使用しています。 [行いたいこと] A→B端末へ、1024Byteずつバイナリデータ(画像)を送信。 [現在行っていること(A端末側のプログラムの概略)] 1.ファイルオープン 2.fread関数にてバイナリデータの入力(whileにてループ) 3.A→Bへパケットを1024Byteずつ送信。 #define DATA_SIZE 1024 main{ int n; char send_Buf[DATA_SIZE + 1]; if((fp = fopen(fname,"rb+")) == NULL){ printf("ファイルエラー\n"); exit(1); } //nが0でなくなったら、ループを抜ける。 while((n = fread(send_Buf,1,DATA_SIZE,fp)) != 0) { sendto(s, send_Buf, n, 0, (LPSOCKADDR)&addrin, sizeof(addrin)); } } A側でビルドはできますがエラーが発生して実行できません。 よろしければ教えていただけないでしょうか。C言語の基礎もきちんと出来ていないからなのかもしれません・・・>< よろしくお願いします。

  • 親スレッドが子スレッドを監視する方法について(マルチスレッド)

    こんにちは。 私は、A端末から送信されたパケットをB端末で受信し、B端末で受信したそのパケットを再度、A端末へ送信するというプログラムを作成しました。 Phase1.A端末(送信側)→B端末(受信側) Phase2. B端末→A端末 ということです。 上記を実現するために、送信端末において、送信スレッド(親スレッド)と受信スレッド(子スレッド)を立てマルチスレッド処理を行っています。以下にプログラムの概要を示します。 main(int argc ,char *argv[]){ UDPSend(s_port,szServer); } static int UDPSend(unsigned short s_port,char *szServer){ hTh = (HANDLE)_beginthreadex(NULL, 0, UDPReceiveData, NULL, 0, &thID); while((n = fread(send_Buf,1,SEND_DATA_SIZE,fp)) != 0) { sendto(s1, send_Buf, n, 0, (LPSOCKADDR)&addrin1, sizeof(addrin1)); } } unsigned __stdcall UDPReceiveData(void *lpx){ while (1) { size = recvfrom(s2, recv_Buf, (int)sizeof(recv_Buf) - 1, 0, (SOCKADDR *)&from, &fromlen); return 0; } } UDPSend関数にて、パケットをB端末へ送信。UDPReceiveData関数にて、B端末からのパケットを受信しています。この場合、UDPSend関数(スレッド?)がUDPReceiveData関数より先に、終わってしまう場合が生じると思っているのですが。 UDPSend関数がUDPReceiveData関数を監視する方法があるのでしょうか? よろしくお願いします。

  • 配列内に通番(文字列)を挿入したいのですが・・・(Winsock利用)

    こんばんわ。 A端末(送信端末)→B端末(受信端末)というように、A端末から複数パケットを送信し、B端末でパケットを受信するというプログラムをUDPを用いて作成しています。 [実装したいこと] ・A端末において各パケットに対して、通番(TCPのシーケンス番号)のよ うなものを挿入し、パケットを送出。 ・B端末で、どの通番を持つパケットを受信することができたか?を確 認したい。 と思っています。 そこで、上記をふまえ以下のようなプログラムを作成しました。 [A端末(送信側)] //main main(int argc ,char *argv[]){   UDPSending(s_port,szServer); } //whileループにてsend_packet関数を何回も呼び出す。packet_Num変数よりカウントアップ。 UDPSending(unsigned short s_port,char *szServer){  int packet_Num = 1;   while((n = fread(send_Buf,1,SEND_DATA_SIZE,fp)) != 0) {    send_packet(packet_Num, s_port, szServer, send_Buf, n);    packet_Num++;  } } //sprintf関数を使用し各パケットに通番を付加 send_packet(int packet_Num, unsigned short s_port, char *szServer, char *send_Buf, int n){   char send_Buff[1500];   //配列初期化   memset(send_Buff,'\0',sizeof(send_Buff));   //send_Bufに文字列を付加?   sprintf(send_Buf+32,"%d\n",packet_Num);   //send_Bufの内容をsend_Buffへコピー   memcpy(send_Buff,send_Buf,n);   UDPDataSend(s_port, szServer, send_Buff, n); } //パケット送出 UDPDataSend(unsigned short s_port, char *szServer, char *send_Buff, int n){   sendto(省略) } 上記のように、sprintf関数を使用しpacket_Num変数の文字列を挿入することで、送出されるパケットに通番を割り振っていることになるのでしょうか? よろしくお願い致します。

  • swith文について

    こんにちは。 switch文を用いて分岐を行っています。 以下のプログラムは、whileの無限ループ内にswitch文の分岐を行っています。while内にrecvfrom関数(ソケット通信用関数)を用いています。recv_Buf配列内をヌル文字まで走査し、文字列の長さによって分岐をしています。 while内のrecvfromによって、他端末から文字列を逐次受信しているのですが、この場合、switch文ではなくif文による分岐を行うべきなのでしょうか? また、breakを行うことで、whileの無限ループまで抜けることになるのでしょうか? switchの場合、breakを用いないと、実行したくないところまで実行してしまう可能性があるので、breakは必要だと思い以下のプログラムにしました。 よろしくお願いいたします。 [プログラム] while(1){   recvfrom(s2, recv_Buf, (int)sizeof(recv_Buf) - 1, 0, (SOCKADDR *)&from, &fromlen);   while(recv_Buf[len]!='\0')   len++;   switch(len){    case 3:     if(memcmp(recv_Buf,"END",3) == 0){      //処理     }     break;    case 5:     if(memcmp(recv_Buf,"START",5) == 0){      //処理     }     break;     case 12:     case 13:     case 14:     case 15:      if(memcmp(recv_Buf,"SEND_PACKET",11) == 0){       //処理      }      break;    } }

  • winsockを使ったTCP及びUDP通信について

    今回winsockを使った通信プログラムを組む事になったのですが、わからない点が多々ありましたので、どなたかご教授頂けると大変ありがたいです。 1. TCP通信において、送信側が"Hoge" "Fuga"と2回sendした際、受信側でrecvすると"Ho" "geFu" "ga"と3回受信する可能性があると認識しているのですが、これは正しいでしょうか? (到着する順序は保証されるが、recvする際に送信側がどのようにsendしたかは考慮されない) 2. UDP通信においては、上記のような現象は起きないと認識しているのですが、これは正しいでしょうか? (UDP通信では、2回sendすれば2回以上はrecvしない。パケットの破棄はあっても、分割はない) 3. もしUDP通信でも上記のような現象が起きる場合、到着順序の保証がされないという観点から、recvした際に"Ho" "ga" "geFu"と受信する事はあり得るのでしょうか? 4. 2が正しい前提での話です。UDP通信では、MTUを超えた場合、自動でパケットが分割されると聞きました。プログラムを組む際、これは意識しないといけないのでしょうか? (MTUが1500Byteの場合、UDPで2000Byteをsendすると、recvで1500,500と2回受信する?) 以上の4点です。 どなたかご存知の方いらっしゃいましたら、是非ご教授ください。

  • Winsockでの送受信についての質問

    本日はじめてOKwaveを利用させていただきます、Nimameです。 以後よろしくお願いします。 本日はwinsockの送受信について質問させていただきたく、投稿しました。 現在winsockを利用したS/Cのネットワークプログラムを組んでいるのですが、 送受信の時、同PC内だとうまくいき、外部PCからだとうまくいかずに困っています。 送受信の際(recv, send)の後にSleep(10)を入れるとうまくいくことから ・パケットが最後まで送信しきれていない ・パケットが最後まで受信しきれていない の以上が原因かと考えています。 そこでサイズ分最後まで送受信をする関数を用意したのですが、 これがどうにもうまく働いていないようでやはりうまくいきません。 -------------------------------------------------------- // 最後まで送りきる int Send(SOCKET s, char *buf, int len) { int endsize; int r; char* sendptr = buf; // 送信する先頭アドレスを取得 // 確実に全てのパケットを送信する while(endsize < len) { r = send(s, sendptr, len - endsize, 0); // 送信結果がエラーなら終了 if( r <= 0 ) return r; sendptr += r; endsize+= r; } sendptr = NULL; return endsize; } -------------------------------------------------------- // 最後まで受信する int Recv(SOCKET s, char *buf, int len) { // 受信データアドレスの設定 char* recvptr = buf; int endsize= 0; // 受信データを1つぶん読み込むまでループする while( endsize < len ) { // 未受信データアドレスに実際にデータを読み込む int r = recv(s, recvptr, len-endsize, 0); // エラーだったら終了する if( r <= 0 ) return r; recvptr += r; endsize+= r; } strext(buf, buf, 0, len); recvptr = NULL; return endsize; } -------------------------------------------------------- 以上なのですが、おかしな点や、改善点などありましたら お教えいただけたら幸です。

専門家に質問してみよう