《UNIX高级环境编程》
linux秉承着万物皆文件的思想,把套接字也弄成了以文件描述符形式描述的的文件。
1.int socket(int domain,int type,int protocol)
domain分AF_INET,AF_INET6,AF_UNIX,AF_UPSPEC(未指定)。
type分SOCK_DGRAM(udp),SOCK_STREAM(tcp),SOCK_RAW(ip),SOCK_SEQPACKET(报文)。
要对socket进行操作在函数内部使用fd即可。
2.htonl,htons,ntohl,ntohs
h代表网络字节序,n代表本地字节序,l代表32位,s代表16位。包含在<arpa/inet.h>中。
3.地址格式sockaddr_in不多说,地址族,端口,ipv4或v6地址。
inet_ntop将二进制转为文本字符串格式,inet_pton相反。
4.地址查询:
网络配置信息存放处:/etc/hosts和/etc/services等。
getaddrifo():允许将一个主机名和一个服务名映射到一个地址
getnameinfo():允许将一个地址转换为一个主机名和一个服务名。
5.将套接字与地址关联
bind()函数用来关联套接字和地址。
getsockname()函数来发现绑定到套接字上的地址。
getpeername()函数来发现与套接字相连的对等方的地址。
6.建立连接及数据传输
TCP:listen()、accept()、connect()、send()、recv()、close()。
UDP:sendto()、recvfrom()。
accept可以替换为poll()、select()、epoll()。那就是另一个故事了,多线程系列,reactor和proactor异步处理模式。
alarm()函数,避免丢包或SOCKET_ERROR等造成的无限期阻塞,还有fcntl。
7.带外数据:
一个字节的紧急信号,优先处理。fcntl中使用F_SETOWN确定套接字所有权,信号是哪里发来的。
对了我按照书上的理解是信号在内核中产生保存在PCB栈中,在返回到用户态时才进行解决,并不会一有信号产生就去解决。内核有忽略,终止等选项,用户自定义的信号也是在返回时处理,除非是kill这种。
8.非阻塞和异步IO(套接字的I/O是基于信号的I/O)
a.通知套接字建立所有权,这样信号可以被传递到合适的进程。
b.当IO不阻塞时通过套接字发信号。
套接字需要与进程绑定,这样才知道哪个套接字对应哪个进程。传输相应的信号SIGIO。