• ベストアンサー

ソケットプログラミング(配列について)

こんにちは。 この掲示板に、大変お世話になっています。 私は送信側から受信側へWindows上でUDPソケットを利用し、約3MByteのmpegデータを、1024Byteずつパケットに分割し送信しています。以下に、送信側のプログラムの概要を示します。 [送信側] ・配列[1025]確保し、fread関数を用いてファイルの読み込みを行い、sendto関数で受信側へ送信。 ・1024Byteずつ送出できているかを表示。 ・送出した1024Byteのパケット数を表示。 int n; int Num_n = 0; char send_buf[1025]; while((n = fread(send_buf,1,DATA_SIZE,fp)) != 0){ Num_n++; //1024Byteずつ送出できているかを表示させています printf("n:%dバイト\t",n); sendto(theSocket,send_buf,n,0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); } //送出したパケット数を表示させています printf("%d個のパケットを送出しました\n",Num_n); <質問内容> 約3MByteのmpegを1024Byteずつ送信した場合、最後のパケットは、「n:4バイト」と表示されました。残りの1020バイト分は、どのような形で送信されているのでしょうか?確保した配列内に何も入っていない形で送信されているのでしょうか? また、私は送信側と受信側でスループットの計算を以下の式から算出しています。 送信側 (送信したパケット数×1024×8)/送信に要した時間 受信側 (受信したパケット数×1024×8)/受信に要した時間 送信したパケット数は3041個。 送信に要した時間=受信に要した時間です。 この場合、送信側での計算として・・・ (3041×1024×8)/送信に要した時間とするのか (3040×1024×8)+4/送信に要した時間とするのか どちらが正当なのでしょうか? よろしくお願いします。

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

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

>約3MByteのmpegを1024Byteずつ送信した場合、最後のパケットは、「n:4バイト」と表示されました。残りの1020バイト分は、どのような形で送信されているのでしょうか?確保した配列内に何も入っていない形で送信されているのでしょうか? 最後は4バイトの送信です。1020バイト分が送信されることはありません。 sendto(theSocket,send_buf,n,0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); のnが送信するサイズ(=4バイト)を示しています。 send_bufの4バイト以降は、ゴミ(前のパケットの残骸)が入っていますが、これは無視されます。 >(3040×1024×8)+4/送信に要した時間とするのか ですが、×8がビットの意味なら (3040×1024×8)+4×8 が正しいです。

bird_2005
質問者

お礼

>send_bufの4バイト以降は、ゴミ(前のパケットの残骸)が入っていますが、これは無視されます。 わかりやすい書き込みありがとうございます。 解決しました。 今後とも、よろしくお願いします。

その他の回答 (1)

  • mssine
  • ベストアンサー率24% (38/156)
回答No.2

>//1024Byteずつ送出できているかを表示させています >printf("n:%dバイト\t",n); >sendto(theSocket,send_buf,n,0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); ここ間違ってますヨ。 これは読み込んだバイト数であって、送信したバイト数ではありません。 printf("n:%dバイト\t", sendto(theSocket,send_buf,n,0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr))); です。

bird_2005
質問者

お礼

解決しました、ありがとうございました。