引言关于connect函数的函数原型int connect(SOCKET s,const struct sockaddr *name,int namelen);而struct sockaddr的结构体长下面这样struct sockaddr { sa_family_t sin_family;//地址族 char sa_data[14]; };其中sa_data中要填入ip与端口等信息不便于操作所以通常是对struct sockaddr_in *操作后转换成struct sockaddr *类型后传入connect函数。struct sockaddr_in 与 struct sockaddr对比struct sockaddr_in 与 struct sockaddrstruct sockaddr { sa_family_t sin_family;//地址族 char sa_data[14]; }; struct sockaddr_in { sa_family_t sin_family;//地址族 uint16_t sin_port; //端口 struct in_addr sin_addr; //32位IP char sin_zero[8]; }其中关于struct sockaddr_in下的struct in_addr sin_addr:有些版本好像是struct in_addr { In_addr_t s_addr; //32位IPv4地址 }但是我下的npcap-sdk-1.13中是这样的//改变了其结构封装 typedef struct in_addr { union { struct { u_char s_b1, s_b2, s_b3, s_b4; } S_un_b; struct { u_short s_w1, s_w2; } S_un_w; u_long S_addr; } S_un; } IN_ADDR, *PIN_ADDR, *LPIN_ADDR; //但是提供了宏访问不过只能在初始化后才能进行访问 #define s_addr S_un.S_addr虽然看起来一大串但里面也只有一个union的类型S_un。本质上是多给了几种方式对其初始化。这里演示用inet_addr()函数对ip处理后传给in_addr初始化示例关于in_addr :unsigned __LONG32 inet_addr(const char *cp);其类型是无符号的long所以给S_un中同为u_long类型的S_addr类型传入就行所以基于上面的结构一次对sturct sockaddr_in初始化struct sockaddr_in server_addr; //给该结构体清空 memset(server_addr, 0, sizeof(server_addr)); //初始化传入ip和端口 server_addr.sin_family AF_INET; server_addr.sin_port htons(port); server_addr.sin_addr.S_un.S_addr inet_addr(ip);
pcap库中的struct sockaddr_in 与 struct sockaddr
发布时间:2026/7/16 15:42:45
引言关于connect函数的函数原型int connect(SOCKET s,const struct sockaddr *name,int namelen);而struct sockaddr的结构体长下面这样struct sockaddr { sa_family_t sin_family;//地址族 char sa_data[14]; };其中sa_data中要填入ip与端口等信息不便于操作所以通常是对struct sockaddr_in *操作后转换成struct sockaddr *类型后传入connect函数。struct sockaddr_in 与 struct sockaddr对比struct sockaddr_in 与 struct sockaddrstruct sockaddr { sa_family_t sin_family;//地址族 char sa_data[14]; }; struct sockaddr_in { sa_family_t sin_family;//地址族 uint16_t sin_port; //端口 struct in_addr sin_addr; //32位IP char sin_zero[8]; }其中关于struct sockaddr_in下的struct in_addr sin_addr:有些版本好像是struct in_addr { In_addr_t s_addr; //32位IPv4地址 }但是我下的npcap-sdk-1.13中是这样的//改变了其结构封装 typedef struct in_addr { union { struct { u_char s_b1, s_b2, s_b3, s_b4; } S_un_b; struct { u_short s_w1, s_w2; } S_un_w; u_long S_addr; } S_un; } IN_ADDR, *PIN_ADDR, *LPIN_ADDR; //但是提供了宏访问不过只能在初始化后才能进行访问 #define s_addr S_un.S_addr虽然看起来一大串但里面也只有一个union的类型S_un。本质上是多给了几种方式对其初始化。这里演示用inet_addr()函数对ip处理后传给in_addr初始化示例关于in_addr :unsigned __LONG32 inet_addr(const char *cp);其类型是无符号的long所以给S_un中同为u_long类型的S_addr类型传入就行所以基于上面的结构一次对sturct sockaddr_in初始化struct sockaddr_in server_addr; //给该结构体清空 memset(server_addr, 0, sizeof(server_addr)); //初始化传入ip和端口 server_addr.sin_family AF_INET; server_addr.sin_port htons(port); server_addr.sin_addr.S_un.S_addr inet_addr(ip);