gpt4 book ai didi

sockets - D语言: UDP client does not receive reply

转载 作者:行者123 更新时间:2023-12-02 13:28:58 24 4
gpt4 key购买 nike

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

最佳答案

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

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

关于sockets - D语言: UDP client does not receive reply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12730106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com