获取套接字的随机端口
Get random port for socket
我知道这个问题已经被问过了,但我似乎是某种 "special",因为我的代码不起作用。
指令是"bind with port 0 and use getsockname to get port"。我做错了什么...
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。
编辑:简单多了,只是 sa.sin_port
愚蠢的问题。
大多数 Berkley Socket API 函数使用非常简单的约定:返回的结果是操作成功的指示。因此,零表示正常,负表示错误。为了安全起见,您必须始终检查它,并且您的代码缺少 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;
}
...
我知道这个问题已经被问过了,但我似乎是某种 "special",因为我的代码不起作用。 指令是"bind with port 0 and use getsockname to get port"。我做错了什么...
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。
编辑:简单多了,只是 sa.sin_port 愚蠢的问题。
大多数 Berkley Socket API 函数使用非常简单的约定:返回的结果是操作成功的指示。因此,零表示正常,负表示错误。为了安全起见,您必须始终检查它,并且您的代码缺少 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;
}
...