繁体   English   中英

套接字绑定返回相同的临时端口

[英]socket bind returns same ephemeral port

我正在尝试通过将0端口值传递给套接字bind function 来将 256 个不同的pthread中的 256 个不同的 sockets 绑定到不同的端口。 但有时同一个端口会绑定到不同的 sockets。 我从调试 output 中发现了这个问题。 有人可以解释为什么会这样。 这是我的示例代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>

unsigned short get_sock_name(int sock_fd) {
    socklen_t sock_len = sizeof(struct sockaddr_in);

    struct sockaddr_in recv_IP_sock_addr;
    getsockname(sock_fd, (struct sockaddr*)&recv_IP_sock_addr, &sock_len);

    return (ntohs(recv_IP_sock_addr.sin_port));
}
    
void* run(void *t) {
    int sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);;
    struct sockaddr_in recv_IP_sock_addr;
    memset((char*)&recv_IP_sock_addr, '\0', sizeof(struct sockaddr_in));
    recv_IP_sock_addr.sin_family = AF_INET;
    recv_IP_sock_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    recv_IP_sock_addr.sin_port = htons(0);
    
    int yes = 1;
    setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, (char*)&yes, sizeof(yes));
    
    bind(sock_fd, (struct sockaddr*)&recv_IP_sock_addr, sizeof(struct sockaddr));
    
    unsigned short port = get_sock_name(sock_fd);
    
    printf("receiving data from port %hu\n", port);
    
    char buff[2048];
    while (1) {
        ssize_t len = recvfrom(sock_fd, buff, sizeof(buff), 0, NULL, NULL);
    }
}

int main() {
    pthread_t pt_arr[256];
    for (int i = 0; i < 256; ++i)
        pthread_create(&pt_arr[i], NULL, run, NULL);
        
    char buff[32];
    fgets(buff, sizeof(buff), stdin);
}

您设置SO_REUSEADDR ,对于 UDP,它允许两个 sockets 绑定到同一个端口。 这是多播所需要的。 将它与单播 UDP 一起使用似乎不是一个特别好的主意。 在让实现 select 端口时使用它似乎也不是一个好主意。

摆脱SO_REUSEADDR因为它没有任何意义,并且会导致 UDP 单播的病理行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM