9

出于测试目的,我想将我的服务附加到某个 TCP 端口。然后,我将调用此端口,确保服务正常工作,然后将其关闭。我需要找到一种方法来生成这样的端口号,因为我不能使用固定的端口号 - 测试可以并行运行。可能吗?

4

2 回答 2

6

我就是这样做的:

#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main() {
    struct sockaddr_in addr;
    socklen_t len = sizeof(addr);
    addr.sin_port = 0;
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0) {
        perror("socket()");
        return -1;
    }
    if (bind(sock, (struct sockaddr*) &addr, sizeof(addr)) != 0) {
        perror("bind()");
        return -1;
    }
    if (getsockname(sock, (struct sockaddr*) &addr, &len) != 0) {
        perror("getsockname()");
        return -1;
    }
    printf("%d\n", addr.sin_port);
    return 0;
}

然后,编译并运行:

cc -o reserve reserve.c && ./reserve

它输出端口号,可用于绑定。

我在 Github 上发布了该工具的完整版本:https ://github.com/yegor256/random-tcp-port

于 2012-11-09T12:27:29.377 回答
2

绑定时只需指定端口零;然后用于getsockname()找出分配了哪个端口,这样您就可以通过其他方式告诉您的客户您正在侦听哪个端口。很少有用。

于 2012-11-09T20:45:32.000 回答