You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Linux系统中未连接、未绑定Socket的Domain

Linux下获取未连接、未绑定Socket的Domain

你的代码运行后返回Domain值为0,问题出在未初始化socklen_t类型的s_len变量,getsockopt函数要求调用前必须指定输出缓冲区的长度,否则无法正确返回Socket域信息。

修正后的代码

#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
    int sd = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0);
    int domain;
    // 关键:初始化s_len为domain变量的字节大小
    socklen_t s_len = sizeof(domain); 

    if(sd < 0){
        perror("socket DID NOT create");
        return 1;
    }
    if(getsockopt(sd, SOL_SOCKET, SO_DOMAIN, &domain, &s_len) < 0){
        perror("getsockopt failed");
        return 2;
    }
    
    const char *so_domain = NULL;
    if(domain == AF_UNIX)
        so_domain = "AF_UNIX";
    else if(domain == AF_INET)
        so_domain = "AF_INET";
    else if(domain == AF_INET6)
        so_domain = "AF_INET6";
    else
        so_domain = "Unknown domain";

    printf("sock domain is: %d : %s\n", domain, so_domain);

    return 0;
}

关键说明

  • getsockopt的第四个参数是输入输出型参数:调用前需要设置为缓冲区(这里是domain)的字节长度,函数执行后会将其更新为实际写入的字节数。如果不初始化,s_len会是栈上的随机值,导致函数无法正确写入domain变量,最终得到错误的0值。
  • 扩展了对AF_INET、AF_INET6等常见Socket域的判断,让代码更通用。

编译运行修正后的代码,就能正确输出Socket对应的域(比如AF_UNIX对应的值1)。

内容的提问来源于stack exchange,提问作者jorge is not ai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:31:09