获取用于 TCP 连接的随机端口
Get a random port for TCP connection
我有一个客户端和一个服务器应用程序。当客户端想要发送文件时,我使用的是TCP连接。当我使用常量端口号进行连接时,它可以工作(服务器接收文件)。
我想使用随机端口,所以我尝试将端口设置为 0。
我的代码是:
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = 0;
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0){
cout << "failed to bind with errno: "<< errno << endl;
exit(1);
}
绑定有效,但使用端口 0,而不是预期的随机端口。
我做错了什么?
嗯,问题解决了。我添加了对getsocketname
的调用
if (getsockname(sockfd, (struct sockaddr *)&serv_addr, &len_inet) < 0){
cout << "failed to get hostname with errno: "<< errno << endl;
exit(1);
}
bind()
不会更新您传递给它的地址结构。这是一个const
参数。如果想知道指定零时选择了哪个端口,则必须使用 getsockname().
当你有可用的提升时,这看起来更明显,并且是可移植的:
#include <boost/asio/io_service.hpp>
#include <boost/asio/ip/tcp.hpp>
int getFreeTCPPort(std::string ipv4)
{
using namespace boost::asio;
io_service service;
ip::tcp::socket socket(service);
socket.open(ip::tcp::v4());
socket.bind(ip::tcp::endpoint(ip::address::from_string(ipv4), 0));
return socket.local_endpoint().port();
}
当然,它不会直接回答您的问题,但是当代码不言自明时,也许问题只是没有出现。
这个小的C工具将帮助您: https://github.com/yegor256/random-tcp-port
只需使用 make
编译它,然后运行./reserve
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么 Serial.println(<char[]>);返回随机字符?
- 字符串-C++后显示的随机字符
- 当套接字连接断开时检测C/C++Unix
- 循环中的随机函数
- 在c++构造函数中使用随机字符串生成器
- 使用std::mt19937从字符串中返回一个随机单词
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 如何在C++中高效地构造随机骰子
- 在类中使用随机生成器时出现性能问题
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 无法在windows上使用mingw将sqlite3与c连接
- 到连接组件算法的问题(递归)
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- C++线程的向量在连接时随机崩溃
- 获取用于 TCP 连接的随机端口
- 为连接的OMNeT++门分配随机选择但匹配的参数
- 在随机分离的数据上标记连接的组件
- 创建一组随机连接的节点
- Qt MySQL 适配器拒绝随机连接:无法分配 MYSQL