簡體   English   中英

獲取套接字的隨機端口

[英]Get random port for socket

我知道這個問題已經被問過了,但我似乎有點“特別”,因為我的代碼不起作用。 指令是“與端口 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 愚蠢的問題。

大多數 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;
}
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM