我知道这个问题已经有人问过了,但我似乎是个 "特殊 "的人,因为我的代码不工作。"指令是 "与端口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的问题。
大多数 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;
}
...