UNIX-网络IPC套接字

《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。

猜你喜欢

转载自blog.csdn.net/parallel2333/article/details/80347228