websocketpp端口问题
- websocketpp代码库地址:
https://github.com/zaphoyd/websocketpp - 库提供了一些例题,在examples目录下,新建vs工程,名称为testee_server,搭建开发环境,将examples\testee_server\testee_server.cpp复制到工程中,修改main函数,增加错误捕获范围。
//......
int main(int argc, char * argv[]) {
// Create a server endpoint
server testee_server;
short port = 9002;
size_t num_threads = 1;
if (argc == 3) {
port = atoi(argv[1]);
num_threads = atoi(argv[2]);
}
try {
// Total silence
testee_server.clear_access_channels(websocketpp::log::alevel::all);
testee_server.clear_error_channels(websocketpp::log::alevel::all);
// Initialize ASIO
testee_server.init_asio();
testee_server.set_reuse_addr(true);
// Register our message handler
testee_server.set_message_handler(bind(&on_message,&testee_server,::_1,::_2));
testee_server.set_socket_init_handler(bind(&on_socket_init,::_1,::_2));
// Listen on specified port with extended listen backlog
testee_server.set_listen_backlog(8192);
testee_server.listen(port);
// Start the server accept loop
testee_server.start_accept();
// Start the ASIO io_service run loop
if (num_threads == 1) {
testee_server.run();
} else {
typedef websocketpp::lib::shared_ptr<websocketpp::lib::thread> thread_ptr;
std::vector<thread_ptr> ts;
for (size_t i = 0; i < num_threads; i++) {
ts.push_back(websocketpp::lib::make_shared<websocketpp::lib::thread>(&server::run, &testee_server));
}
for (size_t i = 0; i < num_threads; i++) {
ts[i]->join();
}
}
} catch (websocketpp::exception const & e) {
std::cout << "exception: " << e.what() << std::endl;
}
catch (...)//捕获其他的错误
{
std::cout << "other exception..." << std::endl;
}
return 0;
}
编译工程,得到testee_server.exe:
测试一:启动testee_server.exe(1),然后再次启动testee_server.exe(2),发现,testee_server.exe(2)仍就能够正常启动,没有catch到任何错误。
解决方法:将testee_server.set_reuse_addr(true);改为testee_server.set_reuse_addr(false); 设置不允许地址复用。
测试二:启动一个端口号为9002的socket服务(名称为socket.exe),然后启动testee_server.exe,发现,testee_server.exe能正常启动,没有catch到任何错误。
解决方法:testee_server.listen(port);默认使用的是IPv6协议:
将其修改该为:testee_server.listen(boost::asio::ip::tcp::v4(), port); 即可。