1、因特网地址结构
struct in_addr{
in_addr_t s_addr; /*ipv4地址*/
}
struct sockaaddr_in{
short int sin_family; /*Internet地址族,如AF_INET(主机字节序)*/
unsigned short int sin_port; /*端口号,16位值 (网络字节序)*/
struct in_addr sing_addr; /*Internet地址,32伴IPV4地址(网络字节序)*/
unsigned char sin_zero[8]; /*添0(为了格式对齐的填充位)*/
}
这两个数据类型是等效的,可以相互转换,通常使用sockaddr_in更为方便。
2、IPV4地址族和字符地址间的转换
#include <arpa/inet.h>
const char *inet_ntop(int domain, const void *restrict addr,char *restrict str, socklen_t size);
返回:成功返回地址字符串指针,出错返回NULL
功能:网络字长离换成点分十进制
int inet_pton(int domain, const void *restrict str,char *restrict addr);
返回:成功返回1,无效格式返回0,出错返回-1
功能:点分十进制转换为网络字节序
参数:
- domain:Internet地址族,如AF_INET
- addr:Internet地址,32位IPV4地址(网络字节序)
- str:地址字符串(点分十进制)指针
- size:地址字符串大小
示例:
3、套接字与地址绑定
3.1、绑定地址
int bind(int sockfd,const struct sockaddr *addr,socklen_t len);
返回:成功返回0,出错返回-1
3.2、查找绑定到套按字的地址
#include<sys/socket.h>
int getsockname(int sockfd, struct sockaddr *restrict addr,socklen_t* restrict alenp);
返回:成功返回0,出错返回-1
3.3、获取对方地址
#include <sys/socket.h>
int getpeername(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict alenp);
返回:成功返回0,出错返回-1
二者区别:
getpeername
只有在连接建立以后才调用,否则不能正确获得对方地址和端口,所以它的参数描述字一般是已连接描述字而非监听套接口描述字。- 没有连接的UDP不能调用
getpeername
,但是可以调用getsockname
和TCP一样,它的地址和端口不是在调用socket就指定了,而是在第一次调用sendto函数以后。 - 已经连接的UDP,在调用connect以后,这2个函数(
getsockname,getpeername
)都是可以用的。