网络套接字:socket
在通信过程中,套接字一定是成对出现的
一个文件描述符指向一个套接字,该套接字内部由内核借助两个缓冲区实现
插头 插座
网络字节序
小端法存储:高位高地址,低位低地址
大端法存储:高位低地址,低位高地址
计算机采用小端法,网络采用大端法,因此需要转换
用到的函数
htonl:--> host to network long:本地专网络(IP)
转过去并不是需要点分十进制,所以需要用到atoi()来转换数据类型string->int
htons:-> host to network short(端口)
ntohl:-> 网络转本地(IP)
ntohs:->网络转本地(端口)
192.168.1.110->string->atoi->int->htonl->网络字节序(早期繁琐)
现在的IP地址转换:
inet_pton:
点分十进制转网络字节序,本地字节序转换为网络字节序
int inet_pton(int af, const char *restrict src, void *restrict dst);
af:ip协议类型 AF_INET 为ipv4 ; AF_INET6为ipv6
src:传入 IP地址(点分十进制) const只读
dst:传出,转换后的网络字节序的IP地址
返回值:成功返回1,
0表示src指向不是一个有效ip地址,
-1表示失败。
inet_ntop:
网络字节序转点分十进制
网络字节序转换为本地字节序String ip
const char *inet_ntop(int af, const void *restrict src,
char dst[restrict .size], socklen_t size);
af:协议v4 or v6
src:网络字节序的IP地址
dst:转换后的本地字节序
size:dst的大小
返回值:成功:dst
失败:null
sockaddr数据地址结构
man 7 ip
struct sockaddr_in addr;
拿到的是结构体,直接取地址没有用,需要进行初始化,在这里进行
addr.sin_family=AF_INET;
addr.sin_port=htons(9527);
int dst;
inet_pton(AF_INET,"192.168.22.45",(void*) &dst);
addr.sin_addr.s_addr=dst;
[*目前在用*] (addr.sin_addr.s_addr=htonl(INADDR_ANY)) 取出系统中有效的任意ip地址, 二进制类型
bind(fd,(struct sockaddr *)&addr,size)
为什么要强转?因为实际定义有效的内容是struct sockaddr,这是古早的数据类型,现在常用为struct sockaddr_in,所以在传入古早函数bind时需要进行强转
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};