《unix网络编程》基本套接口编程

来源:互联网 发布:ubuntu 升级pip 失败 编辑:程序博客网 时间:2024/05/11 15:05


套接口地址结构

  这个地址结构因协议不同而有不同定义,因此以指针形式传递同时传递长度。主要包括成员family, addr, port

   从进程到内核传递相关函数:bind(...), connect(...), sendto(...)

   从内核到进程传递相关函数:accept(...), recvfrom(...), getsockname(...), getpeername(...)

  地址结构中的ip地址值和端口值都是网络字节序(大端模式)

   主机字节序和网络字节序间的转换函数:htons(...), htonl(...), ntohs(...), ntohl(...)

   字符串形式和网络字节序间的转换函数:inet_aton(...), inet_addr(...), inet_ntoa(...), inet_pton(...), inet_ntop(...)

基本的客户端和服务端


socket(...) 创建套接口标识符(关联网络层协议族IPv4/IPv6和传输层类型TCP/UDP)。状态为CLOSED

bind(...) 绑定二元组(关联ipport)。服务器端要绑定众所周知的ipport,客户端则由内核分配ip和临时port

listen(...) 说明为被动套接口和指定最大连接数。状态由CLOSED转为LISTEN。内核为临听套接口维护这个队列:(1)未完成连接队列,状态为SYN_RECV,定时RTT掉弃;(2)已完成连接队列,状态为ESTABLISHED。最大连接数为两队列数和。

accept(...) 从已完成连接队列中返回队头项。

connect(...) (阻塞)完成连接的三次握手或出错时返回。出错情况:(1)ETIMEOUT(2)ECONNREFUSED,接收到RST响应;(3)EHOSTUNREACH网络不可达。 状态由CLOSED先转为SYN_SEND,如成功则最终转为ESTABLISHED,如出错则必须调用close(..)转为CLOSED

close(...) 标识符记数减1,如记数为0则关闭标识符。另shutdown(...)可实现半关闭。


服务器关闭连接。

   服务器端反应:发送FIN给客户端(转为CLOSE_WAIT状态),发送SIGCHLD给父进程,等待客户端发来的FIN并再发送ACK响应。如

   客户端反应:收到FIN并回ACK,发送FIN给服务器(转为TIME_WAIT状态)并等待ACK。如此时试图发送数据到服务器,会得到RST回应。再次试图发送数据时进程收到SIGPIPE信号。

服务器主机崩溃。

   服务器端反应:不发送任何东西。

   客户端反应:在试图发送数据到服务器前并不知服务器已关闭。主动试图发送数据时才得到出错情况。

服务器主机崩溃重启。

   服务器端反应:应用程序无反应。

   客户端反应:试图用之前的套接口发送数据到服务器,会得到RST回应。

并发服务器

fork(...) 新创建一个子进程(父进程的拷贝)。父进程返回子进程ID,子进程返回0,已打开描述符共享。

信号的处理

信号是发生某事件时对进程的通知。一般是异步的。

来源:(1)另一进程; (2)内核

处理:(1)默认处理; (2)sigaction/signal设置自已的处理函数,原型void handler(int signo);

一个进程结束时会向其父进程发送SIGCHLD信号,并且如其父进程没有等待(wait / waitpid)他,那么他将变成一个僵尸进程驻留在内存中。

I/O模型回顾

输入操作一般有两个不同的阶段:(1)等待数据准备好;(2)从内核到进程拷贝数据。   (1)阻塞。常用,阻塞直到数据已准备好并从内核拷贝到进程空间;   (2)非阻塞。不常用,调用I/O函数直接返回,如数据未准备好则报错EWOULDBLOCK,如数据已准备好则把数据从内核拷贝到进程空间;   (3)I/O复用(select/poll)。处理多个描述符时常用,select调用阻塞直到有感兴趣描述符事件发生则返回,此时调用I/O操作把数据从内核拷贝到进程空间;   (4)信号驱动I/O(SIGIO)。先设置好信号SIGIO的自定义处理函数。待数据准备好时进程会收到SIGIO信号,此时调用I/O操作把数据从内核拷贝到进程空间;   (5)异步I/O(aio_*)。调用异步I/O函数不阻塞。数据准备好并从内核 拷到进程空间后才通知进程(信号或指定函数方式通知)。


I/O复用

一个或多个I/O条件(读/写/异常)满足时,内核通知进程。select(...) 测试感兴趣的描述符事件是否发生。描述符数设上限FD_SETSIZE。


poll(...) 与select类似,但不限描述符数量,则只少于OPEN_MAX

原创粉丝点击