UDP套接字绑定失败。

3

我正在尝试使用Node.js连接一个运行中的UDP服务器

int socketDs = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

struct sockaddr_in socket;
memset(&socket, 0, sizeof(socket));
socket.sin_family = AF_INET;
socket.sin_addr.s_addr = inet_addr("SERVER.IP");
socket.sin_port = htons(PORT);

long r = bind(socketDs, (struct sockaddr *)&socket, sizeof(socket));
NSLog(@"Sockect bind: %ld   %s", r, strerror(errno));

无法绑定,返回 Can't assign requested address。但是,sendto 在不绑定的情况下正常工作。

可能的问题是什么。另外,我在 node.js 上没有收到“close”事件。

这是我的服务器代码:

var dgram = require("dgram");
var server = dgram.createSocket("udp4");

var clients = new Array();

server.on("listening", function () {
    var address = server.address();
    console.log("UDP Server listening on " + address.address + ":" + address.port);
});

server.on("message", function (message, remote) {
    console.log(remote.address + ':' + remote.port +' - ' + message);
    }
});

server.on("close") {
    console.log("close");
});

server.on("error") {
    console.log("error");
});

server.bind(PORT);

它是有效的IPv4地址,格式为“xxx.xxx.xxx.xxx”。 - Dawood Mujib
@DawoodMujib 为什么不显示它的值呢?你很可能在NAT后面,并绑定到本地地址,所以我们不会通过这种方式知道你的公共IP。 - user4520
这是我的服务器IP地址:“46.243.150.19”。好的,它没有被NAT隐藏。 - Dawood Mujib
只是猜测。这个问题不太明确。你展示的第一段代码,是客户端代码吗?在客户端中,为什么要绑定到服务器IP?(我猜是因为你提到了sendto很好用。) - Prabhu
我正在尝试绑定到远程机器的 IP。 - Dawood Mujib
显示剩余3条评论
1个回答

0
第一段代码是客户端的代码。您试图绑定到SERVER_IP。这显然会导致您看到的bind错误。您试图将客户端绑定到属于外部系统的IP。
而sendto很好,因为客户端侧有隐式绑定。
客户端不需要显式绑定。您可以省略此部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接