IPv4套接字地址结构通常也称为"网际套接字地址结构",它以sockaddr_in 命名。定义在<netiont/in.h>头文件中。如下图
长度字段sin_len是为增加对OSI协议的支持而随4.3BSD-Reno添加的。正因为有了长度字段,才简化了长度可变套接字地址结构的处理。
以下类型都在头文件<sys/socket.h>中
sa_family_t 套接字地址结构的地址族
socklen_t 套接字地址结构的长度。一般为uint30_t
以下类型在头文件<netinet/in.h>中
in_addr_t IPV4地址,一般为uint32_t
in_port_t TCP或UDP端口,一般为uint16_t
IPV4地址和TCP或UDP端口号在套接字地址结构中总是以网络字节来存储。
不同套接字的地址比较
进程到内核传递套接字地址结构的函数有3个:bind, connect和sendto 。这些函数的一个参数是指向某个套接字地址结构的指针另一个参数是该结构的整数大小。
从内核到进程传递的套接字结构地址函数有4个: accept,recvfrom,getsockname,getpeername.这四个函数是指向某个套接字地址结构的指针和指向表示该结构大小的整数变量的指针
字节排序函数
内存中存储着两个字节有两种方法:一种将低序字节存储在起始地址,称为小端字节序,另一种方法是将高序字节存储在起始地址,着称为大端。
字节操纵函数
bzreo 把字节设为0的函数
inet_aton,inet_addr和inet_ntoa函数
inet_aton,inet_addr和inet_ntoa 在点十进制数串与它长度为32为位的网络字节二进制值间转换IPV4地址
inet_aton和inet_ntop对于IPV4地址和IPV6地址都适用
inet_addr函数还存在一个潜在问题,一些手册页面声明该函数出错时放回-1而不是INADDR_NONE. inet_ntoa该函数以一个结构而不是以指向该结构的一个指针作为其参数。
inet_pton和inet_ntop函数
地址函数转换
// ipv4地址转换函数
int inet_pton(int famliy,const char *strptr,void *addrptr)
{
if(family==AF_INET)
{
struct in_addr in_val;
if(inet_aton(strptr,&in_val))
{
memcpy(addrptr,&in_val,sizeof(struct in_adder));
return (1);
}
return (0);
}
errno =EAFNOSUPPORT;
return -1;
}
inet_ntop 函数实现
sock_ntop和相关函数
readn,writen和readline函数
字节流套接字上调用read或write输入或输出的字节数可能比请求少,原因在于内核中用户套接字的缓冲区可能以达到极限。
为什么诸如套接字地址结构的长度之类的值-结果参数要用指针来传递?
C中函数不能改变按值传递的参数的值,要让被调用的函数修改由调用者传入的某个值,调用者必须传递指向这个待修改值的一个指针