如何获取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
相关产品推荐
相关产品推荐

