UNIX网络编程(三)---套接字编程简介
UNIX网络编程 第3章 套接字编程简介
一、套接字地址基本结构
大多数套接字地址结构以sockaddr_in命名,每个协议族都定义它的套接字地址结构。
1)IPv4套接字地址结构
为什么in_addr结构体内仅有一个in_addr_t字段的结构?
以前地址被分为A,B,C类的时候,为了便于获得地址中的适当字节,允许访问一个32位IPv4地址中的所有4个字节,或者访问它的2个16位值。随着子网划分技术和无类地址编排的出现,不再需要了。
套接字地址结构仅在主机上使用,但并不在主机之间传递。
2)通用套接字地址结构
通用套接字地址结构的唯一用途就是对指向特定于协议的套接字地址结构的指针执行类型强制转换:
其实通用套接字struct sockaddr结构体的大小(16字节)和常用的套接字地址struct sockaddr_in大小一样。
3)IPv6套接字地址结构
4) 新的通用套接字地址结构
二、值-结果参数
套接字地址结构传递的时候,都是传递指针,该结构的长度也作为一个参数传递,不过其传递方式取决于该结构的传递方向:进程到内核,内核到进程。
- 从进程到内核传递套接字结构的函数有3个:bind、connect和 sendto 。这些函数的一个参数是指向某个套接字地址结构的指针,另一个参数是该结构的整数大小。
- 从内核到进程传递套接字结构的函数有4个:accept、recvfrom、getsockname和getpeername。这4个函数的其中两个参数是:套接字结构的指针 和 该结构大小的指针。
原因在于:当函数被调用时,结构大小是一个值,它告诉内核该结构的大小,这样内核在写该结构时不至于越界;当函数返回时,结构大小又是一个结果,它告进程 内核在改结构中究竟存储了多少信息。这些类型的参数称为 值-结果 参数。
一句话概括:
从进程传递给内核的参数是需要让内核知道内核需要读取多少字节
从内核传递给内核的参数是需要让进程知道内核给进程写了多少字节
三、字节排序函数
大端:高序字节存储在起始地址。(像我们写东西)
小端:低序字节存储在起始地址。(WIN,LINUX都采用小端)
这两种格式都有系统可以使用,给定系统所用的字节序称为主机字节序。网络协议指定一个网络字节序(采用大端)。
这两种字节序之间的转换函数:
- 字节操纵函数
五、inet_aton inet_addr 和 inet_ntoa 地址转换函数
a:ASIC n:numeric
由于inet_addr不能处理255.255.255.255(有限广播地址)转化为二进制,因为它出错时返回INADDR_NONE(通常是一个32位均为1的值)
六、函数:inet_pton 和 inet_ntop函数
这两个函数是随IPv6出现的新函数,对于IPv4和IPv6都适用。
第二个函数strprt不能是空指针,调用者必须为目标存储单元分配内存并指定其大小。调用成功,这个指针就是该函数的返回值。如果len太小,则返回一个空指针,并且置errno为 ENOSPC。
七、本书中编写的几个函数(P70,72)