首页 > 学院 > 开发设计 > 正文

网络编程--sockaddr 与 sockaddr_in

2019-11-14 10:22:51
字体:
来源:转载
供稿:网友

From: http://www.it165.NET/PRo/html/201211/4066.html

在初学的时候对二者甚是迷茫一会就晕了 在这里总结一句话:

struct sockaddr 这个结构体是linux的网络编程接口中用来表示ip地址的标准结构体,bind、connect等函数中都需要这个结构体,这个结构体是兼容IPV4和IPV6的。在实际编程中这个结构体会被一个struct sockaddr_in所填充。

sockaddr 在bind的man手册中提到

struct sockaddr { sa_family_t sa_family; //所选协议族AF_INET char sa_data[14]; //ip地址及端口号 }

而sockaddr_in

{ __SOCKADDR_COMMON (sin_); in_port_t sin_port; /* Port number. */ struct in_addr sin_addr; /* Internet address. */ unsigned char sin_zero[sizeof (struct sockaddr) - __SOCKADDR_COMMON_SIZE - sizeof (in_port_t) - sizeof (struct in_addr)]; };

虽然是两个结构体可是二者的占用的内存是一致的,因此可以互相转化。

sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息。是一种通用的套接字地址。

而sockaddr_in 一般是储存地址和端口的。用于信息的显示及存储使用

例如:

struct sockaddr_in addr_server;addr_server.sin_family = AF_INET;addr_server.sin_port = htons(RPORT);addr_server.sin_addr.s_addr = inet_addr(RHOST);

然而,在类似于bind accept的函数中

ret = bind(fd_sock, (struct sockaddr *)&addr_server, sizeof(addr_server));if(ret < 0){ perror("bind"); return -1;}

之前只是这样的记下来了,可是知道一天,想显示所连接的客户端的ip地址的时候,就发现了问题所在

char *inet_ntoa(struct in_addr in);

函数原型是这样的,可是在

struct in_addr{ in_addr_t s_addr;};

这个in_addr是sockaddr_in的一个mamber

fd_connection = accept(fd_sock, (struct sockaddr *)&addr_client, &addr_client_len); if(fd_connection < 0){ perror("accept"); return -1; } printf("connected! : %d/n", fd_connection); printf("%s%s/n", "the client ip is :", inet_ntoa(addr_client.sin_addr));
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表