[socket] 刘傲天带你C++写socket之socket结构体和ipv4地址结构体 - 百年刘傲天

in Ubuntusocket with 0 comment

关于socket

socket地址结构体

struct sockaddr_in{
    sa_family_t sin_family;  //地址族
    u_int16_t sin_port;      //端口号           htons
    struct in_addr sin_addr; //ipv4地址结构体  htonl
};

转换成ipv4地址结构体的方法

#include <arpa/inet.h>
inaddr_t inet_addr(const char * strptr);  //失败返回INADDR_NONE
int inet_aton(const char *cp, struct in_addr* inp);//成功返回1 失败返回0
char * inet_ntoa(struct in_addr in); //将ipv4结构体转换为点分十进制字符串表达的IPV4地址

注意这里的inet_ntoa只返回一个指针,而这个指针的内存是在inet_ntoa里面静态分配的,所以每次调用inet_ntoa都会覆盖之前inet_ntoa的值,也就是说你之前的返回值接收inet_ntoa的指针,指向的内容已经发生了变化

附上代码
例子

 #include <iostream>
 #include <arpa/inet.h>

 using namespace std;

 int main(int args, char ** argv){
 ┆   //创建一个字符串ipv4地址
 ┆   in_addr a;
 ┆   a.s_addr = inet_addr("1.1.1.1");
 ┆   in_addr b;
 ┆   b.s_addr = inet_addr("2.2.2.2");

 ┆   char *ipv41 = inet_ntoa(a);
 ┆   char *ipv42 = inet_ntoa(b);

 ┆   cout << "address 1> " << ipv41 << endl;
 ┆   cout << "address 2> " << ipv42 << endl;
 ┆   return 0;
 }

执行结果

$:g++ ipv4_to_str.cc
$:./a.out
address 1> 2.2.2.2
address 2> 2.2.2.2

更新后的函数原型

int inet_pton(int af, const char * src, void * dst);
const char * inet_ntop(int af, const void * src, char * dst, socklen_t cnt);

inet_pton函数将字符串里的IP地址src转换成网络字节序表示的IP地址,并把转换结果存储到dst指向的内存中,af表示地址族,成功返回1失败返回0并设置errno
inet_ntop函数进行相反的转换,参数相同,最后一个参数指定目标存储单元的大小,成功返回存储单元的地址,失败返回NULL并设置erron

Responses