UDP 绑定:地址已被使用
UDP bind: Address already in use
我对node.js
一无所知。
我正在 C++
中发送 UDP
个数据包,我想在 node.js
中显示它们。
问题是两者都试图占据IP/port。取决于我运行,另一个失败了。我该如何解决这个问题?
main.cpp
// g++ main.cpp -o main -std=c++11 -lboost_system -pthread
#include <iostream>
#include <stdio.h>
#include <string>
#include <boost/asio.hpp>
using boost::asio::ip::udp;
int main(int argc, char* argv[])
{
const int port=1414;
const std::string ip="127.0.0.1";
boost::asio::io_service io_service;
udp::resolver resolver(io_service);
udp::endpoint client_endpoint = *resolver.resolve({udp::v4(), ip, std::to_string(port)});
udp::socket socket(io_service, udp::endpoint(udp::v4(), port));
boost::asio::socket_base::reuse_address option(true);
socket.set_option(option);
std::string data;
for(long i=0;true;i++)
{
data=std::to_string(i+1)+"th packet";
socket.send_to(boost::asio::buffer(data.c_str(), data.length()+1), client_endpoint);
usleep(10);
}
return 0;
}
app.js
var PORT = 1414;
var HOST = '127.0.0.1';
var dgram = require('dgram');
var server = dgram.createSocket('udp4');
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.bind(PORT, HOST);
如果我 运行 C++
文件然后是 js
文件,错误是这样的:
events.js:160
throw er; // Unhandled 'error' event
^
Error: bind EADDRINUSE 127.0.0.1:1414
at Object.exports._errnoException (util.js:1012:11)
at exports._exceptionWithHostPort (util.js:1035:20)
at dgram.js:221:18
at _combinedTickCallback (internal/process/next_tick.js:77:11)
at process._tickCallback (internal/process/next_tick.js:98:9)
at Module.runMain (module.js:577:11)
at run (bootstrap_node.js:352:7)
at startup (bootstrap_node.js:144:9)
at bootstrap_node.js:467:3
同时,如果我先 运行 js
文件然后 C++
文件,我会收到:
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
what(): bind: Address already in use
Aborted (core dumped)
创建套接字时需要设置reuseAddr: true
:
var server = dgram.createSocket({ type: 'udp4', reuseAddr: true });
您还需要更改在 C++ 端创建套接字的方式。当前,您正在使用的 udp::socket
构造函数签名将导致套接字立即绑定。不幸的是,您需要先设置 reuse_address
选项 before 绑定。为此,请试试这个:
udp::socket socket(io_service, udp::v4());
socket.set_option(boost::asio::socket_base::reuse_address(true));
socket.bind(udp::endpoint(udp::v4(), port));
@mscdex 写的是正确的,但@EJP 的建议是一种更标准的方法来完成您(我相信)想要完成的事情。
也就是说,您通常只有服务器在众所周知的端口(如 1414)上,而客户端通常在任何尚未使用的随机端口上启动。
为此,您无需更改js代码,只需更改这部分c++代码:
udp::endpoint client_endpoint
= *resolver.resolve({udp::v4(), ip, std::to_string(port)});
udp::socket socket(io_service, udp::endpoint(udp::v4(), port));
boost::asio::socket_base::reuse_address option(true);
socket.set_option(option);
至:
udp::endpoint client_endpoint
= *resolver.resolve({udp::v4(), ip, std::to_string(port)});
// Passing 0 as the port argument will tell the system to
// pick a random port for you.
udp::socket socket(io_service, udp::endpoint(udp::v4(), 0));
我对node.js
一无所知。
我正在 C++
中发送 UDP
个数据包,我想在 node.js
中显示它们。
问题是两者都试图占据IP/port。取决于我运行,另一个失败了。我该如何解决这个问题?
main.cpp
// g++ main.cpp -o main -std=c++11 -lboost_system -pthread
#include <iostream>
#include <stdio.h>
#include <string>
#include <boost/asio.hpp>
using boost::asio::ip::udp;
int main(int argc, char* argv[])
{
const int port=1414;
const std::string ip="127.0.0.1";
boost::asio::io_service io_service;
udp::resolver resolver(io_service);
udp::endpoint client_endpoint = *resolver.resolve({udp::v4(), ip, std::to_string(port)});
udp::socket socket(io_service, udp::endpoint(udp::v4(), port));
boost::asio::socket_base::reuse_address option(true);
socket.set_option(option);
std::string data;
for(long i=0;true;i++)
{
data=std::to_string(i+1)+"th packet";
socket.send_to(boost::asio::buffer(data.c_str(), data.length()+1), client_endpoint);
usleep(10);
}
return 0;
}
app.js
var PORT = 1414;
var HOST = '127.0.0.1';
var dgram = require('dgram');
var server = dgram.createSocket('udp4');
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.bind(PORT, HOST);
如果我 运行 C++
文件然后是 js
文件,错误是这样的:
events.js:160
throw er; // Unhandled 'error' event
^
Error: bind EADDRINUSE 127.0.0.1:1414
at Object.exports._errnoException (util.js:1012:11)
at exports._exceptionWithHostPort (util.js:1035:20)
at dgram.js:221:18
at _combinedTickCallback (internal/process/next_tick.js:77:11)
at process._tickCallback (internal/process/next_tick.js:98:9)
at Module.runMain (module.js:577:11)
at run (bootstrap_node.js:352:7)
at startup (bootstrap_node.js:144:9)
at bootstrap_node.js:467:3
同时,如果我先 运行 js
文件然后 C++
文件,我会收到:
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
what(): bind: Address already in use
Aborted (core dumped)
创建套接字时需要设置reuseAddr: true
:
var server = dgram.createSocket({ type: 'udp4', reuseAddr: true });
您还需要更改在 C++ 端创建套接字的方式。当前,您正在使用的 udp::socket
构造函数签名将导致套接字立即绑定。不幸的是,您需要先设置 reuse_address
选项 before 绑定。为此,请试试这个:
udp::socket socket(io_service, udp::v4());
socket.set_option(boost::asio::socket_base::reuse_address(true));
socket.bind(udp::endpoint(udp::v4(), port));
@mscdex 写的是正确的,但@EJP 的建议是一种更标准的方法来完成您(我相信)想要完成的事情。
也就是说,您通常只有服务器在众所周知的端口(如 1414)上,而客户端通常在任何尚未使用的随机端口上启动。
为此,您无需更改js代码,只需更改这部分c++代码:
udp::endpoint client_endpoint
= *resolver.resolve({udp::v4(), ip, std::to_string(port)});
udp::socket socket(io_service, udp::endpoint(udp::v4(), port));
boost::asio::socket_base::reuse_address option(true);
socket.set_option(option);
至:
udp::endpoint client_endpoint
= *resolver.resolve({udp::v4(), ip, std::to_string(port)});
// Passing 0 as the port argument will tell the system to
// pick a random port for you.
udp::socket socket(io_service, udp::endpoint(udp::v4(), 0));