• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:UDPソケット通信におけるデータパケット)

UDPソケット通信でのデータパケットの受信バッファサイズについて

Haizyの回答

  • ベストアンサー
  • Haizy
  • ベストアンサー率40% (404/988)
回答No.1

こんにちは。 18バイトですか。たしか、Lengthは、オクテット単位でしたよね??? 理論的に間違っていないなら、理論と実際の設定があってないのではないかと思うのですが・・・。 流れているパケットをアナライズしてみた方がいいと思います。実は、内部で擬似ヘッタがくっついて、アプリデータが入りきっていなかったりとかしません?? その際、Length値に注目してください。この値はヘッターを含む値です。 その設定がうまく行っているか。 設定の段階でここに10バイトが入ってしまうと、ヘッター分抜いて、2バイトしか入りませんし。 ソース内でどうしているかもわからないので、予測の範囲内ですが。 参考になれば。 でわ。

tanakakuni
質問者

お礼

ご回答誠にありがとうございます。 データをスニファーでキャプチャーした結果 UDPのlengthはアプリ(10)+UDPヘッダー(8) 計18バイトになっておりました。 ソースでは送信データサイズ(引数)を10としています。 関数はsendtoを使用しています。 個人的な見解なのですが、仮に内部で擬似ヘッタがくっついて、アプリデータが入りきっていないとした場合でも実際のデータ長は変わりないので、受信出来るパケット数は理論値通りだと推測されるのですが・・・

関連するQ&A

  • UDPパケットのバッファサイズ変更について

    いつも参考にしています。 UDPパケットのバッファサイズ変更についてご教示下さい。 OS:Turbolinux 10 Server(kernel 2.6.8-6smp) サーバでIPv6のUDPパケットを受信しているのですが、負荷をかけると取りこぼしが発生しています。 (秒間300パケットほどの負荷をかけると2割ほどのパケットには応答がありません) アプリ側のログにパケットを破棄したというものがないので、kernelのバッファサイズを疑っているのですが、 IPv6でUDPのパケット(tftpです)のバッファサイズを増やすにはどのようにすればよいでしょうか。 ※負荷をかけているときにnetstat -iで見ると破棄しているパケットはありませんでした。この場合はkernelチューニングは無意味なのでしょうか? ご回答お願いします。

  • 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点です。 どなたかご存知の方いらっしゃいましたら、是非ご教授ください。

  • socket通信でのフィルタリング

    linux環境にてC言語でUDPソケットのプログラムを作成しています。 Aの端末からUDPで受信してパケットヘッダの表示及び、宛先アドレスや宛先ポート番号 を書き換えてBの端末にUDPで送信します。 そこで下記の関数を使用して受信しているのですが、パケットキャプチャのように なんでも受信してしまいます。 socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) これを特定のポート番号だけ受信(フィルタ)するにはどのようにすれば良いのでしょうか?

  • javaのUDP受信プログラムについて

    UDPで数値データを受信してある処理をしようと考えております。 そこで↓のページで公開されている受信プログラムを使用してデータを受信しました。 http://news.mynavi.jp/column/java/052/index.html import java.net.*; public class UDPServer { public static void main(String[] argv) throws Exception { // 5100番ポートを監視するUDPソケットを生成 DatagramSocket receiveSocket = new DatagramSocket(5100); // 受け付けるデータバッファとUDPパケットを作成 byte receiveBuffer[] = new byte[1024]; DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length); while (true) { // UDPパケットを受信 receiveSocket.receive(receivePacket); // 受信したデータを標準出力へ出力 System.out.println (new String(receivePacket.getData(), 0, receivePacket.getLength())); } } } 別のプログラムから「50」という数値を送信し、上記のプログラムで受信すると、勝手にASCIIコードに変換されてしまっているようで、ASCIIコードの10進数の50にあたる「2」が出力されてしまいます。 これをASCIIコードに変換せずに、表示させる方法を教えて下さい。 もしくは、受信データをバイナリで表示する方法があれば、そちらも教えていただけるとありがたいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Etherealを使ったUDPプロトコルのキャプチャについて

    こんばんは。 この掲示板に大変お世話になっています。 私は、簡単なUDPソケットプログラムを作って、送信側から受信側へアドホック通信(ワイヤレス環境)にて、約3MByteのmepgファイルを1024Byteずつ送信しています。使用コンパイラはVisual C++.NETです。 私は、送信側から送出したパケットをプログラム内でカウントさせ、かつ受信側でも受信したパケットをカウントし、カウント数をDOSプロンプト上に表示させています。パケット数は3041個です。 しかし、送信側で送出したパケットがきちんと送出されていないような気がして、Etherealを用いてUDPをキャプチャしてみたところ、2800個程度しか送出できていませんでした。こういう事ってあるのでしょうか? 2800個を改善するために、パケット送信間隔を開けることで改善できました。パケット送信間隔というのは、sendto関数が呼び出された後に、sleep関数を用いて1パケット送信後に、ある時間待機させるということです。 また、Ethereal(キャプチャリングソフト)を使用することが初めてなのですが、このソフトはトランスポート層レベルでのキャプチャソフトなのでしょうか? よろしくお願いします。

  • WinsockによるUDP通信にて

    WinsockでUDP通信を行うプログラムを作っているのですが、 原因不明の問題が発生していて困っています。 通信手順は以下のとおりです。 (1) クライアントからサーバへ要求パケット送信 (2) 要求パケットを受け取ったサーバは、クライアントへACKを送信 (3) サーバが要求に対する応答パケットをクライアントへ送信 (4) 応答パケットを受け取ったクライアントは、サーバへACKを送信 クライアント-サーバ間でやりとりするデータは最大で992バイト、 それ以上になる場合は、分割して送信します。 パケットの分割が発生しない場合は、(1)~(3)がパケットの損失もなく通信できるのですが、 パケットの分割が発生する場合には、2回目以降の(4)のパケットがクライアントに届きません。再現率は今のところ100%です。 クライアント側のselect関数でもソケットを検出しません。 たしかにUDPは信頼性が低いですが、パケット分割が発生しないパターンでは100%届くので、UDPの仕様とは関係ないような気がします。 原因がさっぱりわからないので、アドバイスをお願いいたします。 ちなみに、クライアント、サーバともに同一端末内にあります(双方がループバックアドレスに対してパケットを送信)が、 これはテスト段階だからであって、本来はそれぞれ別々の端末で動作します。

  • ソケットで通信できない

    Solaris + C で作成したプログラムAと、 PC上のVBで作成されたアプリBとの通信を行おうとしていま。 PC側のVBで、 Winsock.LocalPort = 3000 Winsock.Listen の処理があります。 Aではソケットの生成(socket)→接続(connest)→書込み(write)を行っていますが、すべて成功している模様です。 ・・が、VB側のWinsock_DataArrivaでブレークしていても、一向に受信する気配がありません。 VB及びソケットに関して、ほとんど知識がないので上記処理であっているかも分かっていません。 解決策をご存知の方がおられましたら、ご教授願いたく。

  • パケット通信時のIPヘッダの取得方法について

    RedHat Linux9上で、g++3.2を使用して、ソケット通信の プログラムを作成していますが、UDPやTCPパケットを受信した際に 各パケットのIPヘッダを取得したいのですが、どのように行えばよいのでしょうか? RAWソケットを使用すればできるかとも思ったのですが、下記のURLに 「IPPROTO_RAW 経由でのあらゆる IP プロトコルの受信は、 raw ソケットを用いては行えない。」と書かれています。 http://www.linux.or.jp/JM/html/LDP_man-pages/man7/raw.7.html 上記のURLには、下記のようにも書かれていました。 packetソケットを使用しなければ実現できないのでしょうか? もし、そうならばpacketソケットのサンプルがありましたら、 教えていただけないでしょうか。 「IPPROTO_RAW ソケットは送信専用である。もしどうしてもすべての IP パケットを受信したい場合は、 packet(7) ソケットを ETH_P_IP プロトコルで用いること。」

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

    こんにちは。 この掲示板に、大変お世話になっています。 私は送信側から受信側へ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/送信に要した時間とするのか どちらが正当なのでしょうか? よろしくお願いします。

  • スループット計算方法について

    私は、UDPソケットプログラミングをしています。 送信側から、受信側へ1024byteずつUDPを利用してパケットを送信しています。送信側プログラムでは、配列を1025確保し、受信側でも同様に配列を1025確保しています。 スループット計算を以下に示す計算方法で計算しました。 [送信側] (送信パケット数×パケット長(1024))/送信にかかった時間 [受信側] (受信パケット数×パケット長(1024))/受信にかかった時間 送信にかかった時間=受信にかかった時間とします。 そこで、質問させていただきます。 上記計算式で、パケット長=1024ではなく、1000で計算する方が正しいのでしょうか? よろしくお願いします。