Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 获取套接字的随机端口_C_Sockets_Port_Bind - Fatal编程技术网

C 获取套接字的随机端口

C 获取套接字的随机端口,c,sockets,port,bind,C,Sockets,Port,Bind,我知道这个问题已经被问过了,但我似乎有点“特别”,因为我的代码不起作用。 指令是“绑定端口0并使用getsockname获取端口”。我做错了什么 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 *s

我知道这个问题已经被问过了,但我似乎有点“特别”,因为我的代码不起作用。 指令是“绑定端口0并使用getsockname获取端口”。我做错了什么

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.sinu端口
愚蠢的问题。

大多数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;
}
...
。。。
intsock=socket(AF_INET,sock_STREAM,0);
if(sock<0){
//记录错误等
返回;
}
int res=bind(sock、serverptr、sizeof(sa));
如果(res<0){
//记录错误等
关闭(袜子);
返回;
}
socklen_t s=sizeof(sa);
res=getsockname(sock、serverptr和s);
如果(res<0){
//记录错误等
关闭(袜子);
返回;
}
...

g始终打印为0。-您是否阅读了
getsockname
文档?它清楚地指出“成功时,返回零。出错时,返回-1,并适当地设置errno。”“因此,零表示OK”-更准确地说,非负表示OK,因为并非所有套接字函数在成功时都返回0(例如,
recv()
),但在失败时它们都返回负数(通常为-1)。谢谢@RemyLebeau,过去的记忆并不总是正确的:)