如何编写一个打开两个相邻端口的函数。例如,第一次可能需要端口1234和1235,下一个呼叫可能需要5678和5677,依此类推。
我遇到的问题是,如果我首先使用短暂的端口,我不能保证相邻的任何一个端口都被占用。所以解决方案是在一个循环中采用一个短暂的端口,不断尝试取一个相邻的端口,直到找到一个。
使用随机端口与短暂端口具有相同的问题。
如果我不断添加一个尝试接收端口,我在哪里停止并开始,何时停止搜索?
是否可以快速测试两个端口是否打开,最好不必先打开它们。我宁愿拥有独立于操作系统的解决方案,但是如果我必须为每个操作系统编写一个解决方案,那就没问题了。
答案 0 :(得分:0)
通常,当您打开套接字并连接到服务器或发送UDP数据报时,操作系统会将下一个可用端口打开为临时端口。但是,您不能相信这一点,这取决于许多因素,包括其他应用程序打开套接字,操作系统实现等。
如果要打开相邻的套接字,则需要在发送数据报之前绑定套接字。
代码将是这样的:
#include <sys/socket.h>
...
int main() {
int ret;
int fd[65536];
struct sockaddr_in myaddr;
uint16_t port = 10000;
for(int i = 1; i < 65536; i++)
{
fd[i] = socket(AF_INET, SOCK_DGRAM, 0);
if (fd[i] < 0) exit(1);
// Local
memset(&myaddr, 0, sizeof(struct sockaddr_in));
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(i);
myaddr.sin_addr.s_addr = inet_addr(MY_IP_ADDRESS);
ret = bind(fd[i], (struct sockaddr *)&myaddr, sizeof(struct sockaddr));
...
}
...
return 0;
}