D语言:UDP客户端没有收到回复

Posted

技术标签:

【中文标题】D语言:UDP客户端没有收到回复【英文标题】:D language: UDP client does not receive reply 【发布时间】:2012-09-25 15:45:48 【问题描述】:

我为 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 中网络编程的最佳资源是什么?

【问题讨论】:

【参考方案1】:

服务器上的 UDP 套接字没有“连接”,所以你不能使用send。它可能返回了一条您没有检查的错误消息。在服务器上,使用receiveFromsendTo 来回复消息。

请注意,虽然 UDP 是一个无连接协议,但套接字 API 支持连接的 UDP 套接字的概念,它只是当您调用 send 时记住目标地址的套接字库。它还会在调用receive 时过滤掉不是来自连接地址的消息。连接的套接字通常不适合 UDP 服务器程序。

【讨论】:

【参考方案2】:

receive() 和 receiveFrom() 默认会屏蔽。这很可能是它挂起的原因。在缓冲区大小不够的情况下,send() 也可能会阻塞。处理 UDP 时应使用 sendTo() 和 receiveFrom() 方法。

此外,如果您想将一些数据从“服务器”发送到您的“客户端”,那么基本上两者都应该被编码为服务器和客户端,并且都应该知道它们发送数据包的地址,所以你会有考虑到这一点来重构您的代码。

很久以前,当我开始网络编程时,Beej's Guide 是最好的,我仍然认为它是。您应该能够轻松地将 C 源从该指南移植到 D。

【讨论】:

以上是关于D语言:UDP客户端没有收到回复的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Java DatagramSocket 没有收到客户端发送的所有 udp 数据包?

当UDP协议客户端给TCP协议服务器发数据会发生什么

TCP和UDP的差异

UDP 连接没有收到来自服务器的任何回复 - Python(也可能是使用 boost 的 c++)

从客户端接收到第一个数据包后,C ++ UDP Socket无法从服务器发送回客户端

急求C#程序,用UDP协议实现客户端与服务器之间的信息交互!谢谢