获取套接字的随机端口

问题描述 投票:-1回答:1

我知道这个问题已经有人问过了,但我似乎是个 "特殊 "的人,因为我的代码不工作。"指令是 "与端口0绑定,并使用getockname获取端口"。我到底做错了什么...

struct sockaddr_in sa;

sa.sin_port=htons(0);
sa.sin_addr.s_addr=htonl(INADDR_ANY);
sa.sin_family=AF_INET;

int sock;
sock = socket(AF_INET, SOCK_STREAM, 0);

struct sockaddr *serverptr = (struct sockaddr*)&sa;
bind(sock, serverptr,sizeof(sa));
socklen_t s=sizeof(sa);
int g=getsockname(sock,serverptr,&s);

g总是打印为0。

EDIT:原来如此简单,只是sa.sin_portDumb的问题。

c sockets port bind
1个回答
1
投票

大多数 Berkley Socket API 函数都使用非常简单的约定:返回的结果是操作成功的指示。因此,0 表示 OK,负表示错误。为了安全起见,你必须经常检查它,而你的代码中缺少了对 socket(), bind()getsockname() 呼叫。

...
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
    // log the error, etc
    return;
}
int res = bind(sock, serverptr, sizeof(sa));
if (res < 0) {
    // log the error, etc
    close(sock);
    return;
}
socklen_t s = sizeof(sa);
res = getsockname(sock, serverptr, &s);
if (res < 0) {
    // log the error, etc
    close(sock);
    return;
}
...
© www.soinside.com 2019 - 2024. All rights reserved.