我知道这个问题已经被问过了,但我似乎是某种“特殊”,因为我的代码不工作。指令是“绑定端口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.sin_port愚蠢的问题。
2条答案
按热度按时间eit6fx6z1#
大多数Berkley Socket API函数使用非常简单的约定:返回的结果是操作成功指示。所以,零表示正常,负表示错误。为了安全起见,您必须始终检查它,并且您的代码对于
socket()
,bind()
和getsockname()
调用缺少此验证:k2arahey2#
编译:gcc getport. c-o getport
用法:./getport [address]