4

UDP エコー クライアントとサーバーのおもちゃの例を作成しました。しかし、サーバーからの応答がなく、何が間違っているのだろうかと思います。

クライアント:

#!/usr/bin.rdmd
import std.stdio;
import std.socket;
import std.string;
import std.conv;
import std.random;
import std.outbuffer;

int main(string[] args) {
  if (args.length != 3) {
    writefln("usage: %s <server host> <port>",args[0]); 
    return 0;
  }

  auto s = new UdpSocket();

  auto addr = new InternetAddress(args[1], to!ushort(args[2]));
  s.connect(addr);
  scope(exit) s.close();

  for (int i = 0; i < 1000; i++){
    auto r = uniform(int.min,int.max);
    auto send_buf = new OutBuffer();

    send_buf.write(r);

    s.send(send_buf.toBytes());

    ubyte[r.sizeof] recv_buf;
    s.receive(recv_buf);

    assert(r == *cast(int*)(send_buf.toBytes().ptr));
  }



  return 0;
}

サーバ:

#!/usr/bin.rdmd
import std.stdio;
import std.socket;
import std.string;
import std.conv;

int main(string[] args) {
  if (args.length != 2) {
    writefln("usage: %s <port>",args[0]); 
    return 0;
  }

  auto s = new UdpSocket();

  auto addr = new InternetAddress("localhost", to!ushort(args[1]));
  s.bind(addr);

  while (true){
    ubyte[int.sizeof] recv_buf;
    s.receive(recv_buf);

    writefln("Received: %s\n",recv_buf);

    s.send(recv_buf);


  }

  writeln("sent");

  return 0;
}

プログラムを実行すると、サーバーがすでに応答を送信しているのに、クライアントが受信でハングすることがわかります。

私が間違っていることを知っていますか?

ところで、D でのネットワーク プログラミングに最適なリソースは何ですか?

4

2 に答える 2

3

サーバーの UDP ソケットは「接続」されていないため、使用できませんsend。確認していないエラー メッセージが返された可能性があります。サーバーでは、 with を使用receiveFromsendToてメッセージに返信します。

UDP はコネクションレス プロトコルですが、ソケット API は接続された UDP ソケットの概念をサポートしていることに注意してください。これは、 を呼び出すときのターゲット アドレスを記憶するソケット ライブラリにすぎませんsend。また、 を呼び出すときに、接続されたアドレスから来ていないメッセージを除外しますreceive。接続されたソケットは通常、UDP サーバー プログラムには適していません。

于 2012-10-05T01:43:04.617 に答える
1

receive()receiveFrom()はデフォルトでブロックされます。それがおそらくハングする理由です。send() は、バッファ サイズが十分でない場合にもブロックされる可能性があります。UDP を扱うときは、sendTo() および receiveFrom() メソッドを使用する必要があります。

さらに、「サーバー」から「クライアント」にデータを送信する場合は、基本的に両方をサーバーとクライアントの両方としてコーディングする必要があり、両方がパケットの送信先のアドレスを知っている必要があるため、リファクタリングする必要がありますこれを念頭に置いてコーディングします。

昔、私がネットワーク プログラミングを始めたときは、 Beej's Guideが最高でした。今でもそうだと思います。そのガイドから C ソースを D に簡単に移植できるはずです。

于 2012-10-04T17:27:19.780 に答える