《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(...) 绑定二元组(关联ip和port)。服务器端要绑定众所周知的ip和port,客户端则由内核分配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。
- 《unix网络编程》基本套接口编程
- unix网络编程之基本套接口编程
- unix网络编程之基本套接口编程
- unix网络编程之基本套接口编程
- UNIX网络编程读书笔记:基本SCTP套接口编程
- Unix网络编程之套接口选项
- Unix网络编程卷1第4章 - 基本TCP套接口编程
- 《UNIX网络编程 卷1 套接口编程 》搜索目录
- 网络编程学习笔记(Unix域套接口地址)
- 基本UDP套接口编程
- 基本TCP套接口编程
- 基本UDP套接口编程
- 基本TCP套接口编程
- 网络编程学习笔记(基本套接口选项)
- unix下socket套接口编程详解
- UNIX的套接口(Socket)编程
- 网络编程2 - TCP套接口编程
- 网络编程3 - UDP套接口编程
- 问题六十八: 在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1~100分。 选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。
- Hadoop Run on openstack
- vs2010 下编译 libjingle 库
- 单链表之Java实现
- 489 - Hangman Judge
- 《unix网络编程》基本套接口编程
- ActivityGroup相关--getLocalActivityManager()
- Android优秀开源项目 UI项目居多
- smarty内建函数讲解
- android 开发布局之LinearLayout
- GDB调试精粹及使用实例(From ChinaUnix)
- eBook learning
- 跟Google学习Android开发-起始篇-保存数据(1)
- ROLLUP 与 CUBE 运算符的使用