




已阅读5页,还剩136页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020 3 18 1 协议分层TCP IP协议栈与OSI网络模型TCP IP网络中的套接字对 源IP 源Port 目的IP 目的Port C S编程模型并发式服务器 通常基于TCP 循环式服务器 通常基于UDP 第1章 2020 3 18 2 3 传输层 TCP UDP 网络层 IP 数据链路层 Ethernet 物理层 应用层 HTTP FTP SMTP TCP IP网络协议栈 2020 3 18 3 TCP IP网络协议栈 2020 3 18 4 5 循环应答服务请求 循环式服务器 2020 3 18 5 6 众所周知端口监听通信请求 并分配临时端口用于建立通信连接 并发式服务器 2020 3 18 6 第2章 主要内容 Linux下的C编程环境中的重要知识 进程 进程创建 子进程派生资源拷贝 子进程资源的回收 线程 线程创建 共享资源 线程同步信号 信号掩码 可重入函数时间与定时器 设置定时器文件操作 打开 关闭 文件属性 2020 3 18 7 8 初始进程 fork 返回新进程pid 返回0 pid fork switch pid case 1 Error case0 子进程 default 父进程 进程标识及进程创建 pid tpid getpid pid tppid getppid 2020 3 18 8 进程执行exit进程的main函数执行return进程收到了无法处理的信号 kill sSIGKILL28393 9 进程终止 2020 3 18 9 僵死进程的产生及其危害 UNIX为了让父进程随时了解子进程的状态 设计了 在每个进程退出的时候 内核释放该进程所有的资源 包括打开的文件 占用的内存等 但是仍然为其保留一定的信息 包括进程号theprocessID 退出状态theterminationstatusoftheprocess 运行时间theamountofCPUtimetakenbytheprocess等 此时它将变成一个僵尸进程 Zombie 直到父进程通过wait waitpid来取时才释放 危害 如果进程不调用wait waitpid的话 则保留的那段信息就不会释放 其进程号就会一直被占用 但是系统所能使用的进程号是有限的 如果大量的产生僵死进程 将因为没有可用的进程号而导致系统不能产生新的进程 2020 3 18 10 11 子进程退出的异步善后处理 父进程通过wait和waitpid等函数等待子进程结束 这会导致父进程挂起 如果父进程很忙 那么可以用signal函数为SIGCHLD安装handler 因为子进程结束后 父进程会收到该信号 可以在handler中调用wait回收 如果父进程不关心子进程什么时候结束 那么可以用signal SIGCHLD SIG IGN 通知内核 自己对子进程的结束不感兴趣 那么子进程结束后 内核会回收 并不再给父进程发送信号 还有一些技巧 就是fork两次 父进程fork一个子进程 然后继续工作 子进程fork一个孙进程后退出 那么孙进程被init接管 孙进程结束后 init会回收 不过子进程的回收还要自己做 2020 3 18 11 12 pid twait int stat loc pid twaitpid pid tpid int stat loc intoptions 参数pid 0 等待进程号 pid的子进程参数options WNOHANG 则若无已结束之子进程 则返回0返回值 已结束运行的子进程id代表成功 1代表失败 voidsigchld handler intsigno 等待已退出的所有子进程 do pid waitpid 1 子进程退出的异步善后处理 2020 3 18 12 父进程先于子进程结束 能否产生僵死进程 每个进程结束的时候 系统都会扫描当前系统中所运行的所有进程 看有没有哪个进程是刚刚结束的这个进程的子进程 如果是的话 就由Init来接管他 成为他的父进程 故 子程序退出时 由Init回收 不会产生僵死进程 2020 3 18 13 每个线程有一个标识 类型为pthread t 只在所属的进程中有效 不具备全局性 14 intpthread equal pthread ttid1 pthread ttid2 0表示不等 pthread tpthread self void 线程标识 2020 3 18 14 15 intpthread create pthread t restrictthread constpthread attr t restrictattr void start routine void void restrictarg thread 新创建线程attr 线程属性 默认可用NULLstart routine 新创建线程的线程入口函数arg 向线程函数提供的运行参数 可以为一个结构体指针 以便传递多个参数 创建线程 2020 3 18 15 一个进程中任何一个线程调用exit Exit或 exit 都将导致整个进程终止当线程收到一个默认为终止进程的信号时也将导致整个进程的终止一个线程可以通过下面三个方式退出 而不会造成整个进程的终止线程在线程函数中执行return线程被同一进程的其他线程执行pthread cancel线程执行pthread exit 16 终止线程 2020 3 18 16 17 includeintpthread cancel pthread tthread intpthread join pthread tthread void ptr voidpthread exit void ptr pthread cancel函数用来取消一个线程的执行 当执行取消操作后 线程的善后处理程序将被调用 pthread join函数用来等待线程的终止 因此除非被指定的线程已经终止了 否则调用该函数的线程将被阻塞 直到指定的线程结束运行ptr为一void指针 与传给启动线程的参数类似 进程中的其他线程可以通过调用pthread join函数访问该指针 若对线程返回码不感兴趣 可设为NULL 终止线程 2020 3 18 17 为了解决多个线程同时访问临界资源的问题 Linux提供了互斥量mutex对临界资源进行保护 确保同一时间只有一个线程访问数据 18 互斥量 2020 3 18 18 19 includeintpthread mutex lock pthread mutex t mutex intpthread mutex unlock pthread mutex t mutex intpthread mutex trylock pthread mutex t mutex pthread mutex lock用来对互斥量进行加锁 若互斥量已经加锁 则调用线程将被阻塞pthread mutex unlock用来对互斥量进行解锁 当线程对临界资源操作完毕 则调用该函数释放互斥量锁pthread mutex trylock用来尝试对互斥量进行加锁 当加锁失败后 调用线程并不阻塞 互斥量加锁 2020 3 18 19 20 includeintpthread cond wait pthread cond t restrictcond pthread mutex t restrictmutex intpthread cond signal pthread cond t cond pthread cond tcond PTHREAD COND INITIALIZER pthread cond wait函数使用参数mutex对条件变量进行保护 调用线程被放到等待条件变为真的线程队列上 然后对mutex进行自动解锁这两步操作属于原子操作pthread cond signal函数通知系统条件已变为真 于是等待线程被唤醒并自动加锁mutex 条件变量 2 该内存只能由cond指针来访问 2020 3 18 20 21 线程1 void thread1 run void arg for pthread mutex lock 定义临界资源互斥变量 pthread mutex tmqlock PTHREAD MUTEX INITIALIZER 定义条件变量 pthread cond tmqlock ready PTHREAD COND INITIALIZER 条件变量 3 2020 3 18 21 22 线程2 void thread2 run void arg for pthread mutex lock 处理此分组 条件变量 4 条件检查1 空 休眠 自动解锁2 不空 满足条件 返回并自动上锁 2020 3 18 22 23 Linux常见信号 2020 3 18 23 24 信号如何产生 用户在终端键入CTRL C 产生SIGINT中断信号硬件异常产生相应信号 如SIGSEGV信号产生于非法内存地址引用kill函数允许一个进程向其他进程发送信号控制台kill命令允许Linux用户向进程发送消息 例如杀死某个进程 2020 3 18 24 25 kill l 列出当前linux支持的信号种类kill ssignal namepid 向进程pid发送信号kill signal name pidkill signal number pid includeintkill pid tpid intsig 调用成功返回0 错误返回 1 并设置errno EINVAL 信号非法或不被支持EPERM 调用者没有权限发送此信号ESRCH 信号接收方不存在 1 Kill命令 2 Kill函数 KILL命令和KILL函数 2020 3 18 25 26 对信号的处理方式 忽略信号收到信号然后直接丢弃 进程可以忽略大多数信号 但是SIGKILL和SIGSTOP信号除外捕获信号定义信号处理程序 当信号发生时执行该信号处理程序 SIGKILL和SIGSTOP除外缺省处理每个信号都有一个默认的处理方式 通常是结束接收信号的进程 2020 3 18 26 27 信号集常用的操作函数 includeintsigemptyset sigset t set intsigfillset sigset t set intsigaddset sigset t set intsigno intsigdelset sigset t set intsigno intsigismember constsigset t set intsigno 2020 3 18 27 28 includeintsigprocmask inthow constsigset t restrictset sigset t restrictoset oset 若其非空 则当前进程的信号掩码将通过oset返回set 用于设置的新信号集合how 指明将怎样根据非空的set参数来修改当前进程的信号掩码 取值分为3种情况 SIG BLOCK 将信号集合set添加到当前被阻塞信号集中SIG UNBLOCK 从当前被阻塞信号集中删除信号集合setSIG SETMASK 设置当前被阻塞信号集合为指定的set sigprocmask函数 检查或修改信号掩码 注意 sigprocmask函数只能用于单线程 2020 3 18 28 29 信号处理函数sigaction includeintsigaction intsignum conststructsigaction restrictact structsigaction restrictoldact signum 所要捕获或者忽略的信号act 代表新设置的信号处理结构体oldact 代表之前设置的信号处理结构体structsigaction void sa handler int 信号处理函数 sigset tsa mask 信号掩码 intsa flags 信号处理选项 如SA RESTART void sa sigaction int siginfo t void SIG DFL defaultSIG IGN ignore 2020 3 18 29 30 structsigactionact intmain intargc char argv act sa handler catchctrlc act sa flags 0 清空信号掩码 设置SIGINT的信号处理函数if sigemptyset voidcatchctrlc intsigno 恢复SIGINT信号处理函数 act sa handler SIG DFL if sigaction SIGINT act NULL 1 捕捉信号 CATCHCTRLC C 2020 3 18 30 31 structsigactionact memset 通过忽略信号 进程可以避免被不希望的异步事件打断 忽略信号 IGNORESIG C 2020 3 18 31 可重入函数与不可重入函数 可重入函数 可以被多个同时运行的任务共同执行而不会造成临界资源混乱的函数 不可重入函数 不可以被多个同时运行的任务所调用 除非采用互斥保护措施 如信号量或暂时禁止中断 以确保临界资源丢失或混乱 2020 3 18 32 可重入函数的特点 不在连续的多次调用中使用静态数据来保存状态不返回一个指向静态数据的指针 函数所需所有数据都由调用者提供使用局部数据 或者使用全局数据的一个本地拷贝不调用任何不可重入函数 2020 3 18 33 对临界区代码的保护 在临界区代码前执行用信号掩码来暂时阻塞某些信号 临界区代码执行完毕后 取消阻塞 2020 3 18 34 sigset tnewmask oldmask zeromask structsigactionact 注册act if sigaction SIGALARM 对临界区代码的保护 2020 3 18 35 36 includetypedeflongtime t 表达时间的最简单数据类型是time ttime t表示从epoch以来所经过的秒数因为32比特的long类型目前最多能表示2 147 483 647秒 因此到2038年时将会产生溢出 时间表示 1 2020 3 18 36 37 structtimeval include time ttv sec 秒 suseconds ttv usec 微秒 structtimespec include time ttv sec 秒 longtv nsec 纳秒 时间表示 2 2020 3 18 37 38 structtm include inttm sec 秒 inttm min 分 inttm hour 时 inttm mday 日期 inttm mon 月份 inttm year 年 inttm wday 星期 0 6 inttm yday 一年中的第几天 1 365 inttm isdst 是否采用夏令时 ifdef BSD SOURCElongtm gmtoff GMT时区偏移 constchar tm zone 时区缩写 endif BSD SOURCE 时间表示 3 2020 3 18 38 39 includetime ttime time t t 返回当前时间 其值为从epoch以来所经过的秒数 includeintgettimeofday structtimeval tv structtimezone tz 返回当前时间在tv 其值为从epoch以来所经过的秒数和微秒数tz已过时不再使用 获得时间 2020 3 18 39 40 includeunsignedintsleep unsignedintseconds intusleep unsignedlongusec intnanosleep conststructtimespec req structtimespec rem 对sleep函数 用于指定休眠的 秒 数 当被中断后 返回值可以为剩下未休眠的 秒 数对usleep函数 用于指定休眠的 微秒 数对nanosleep函数 用于指定休眠的 纳秒 数 参数rem用来存放剩下未休眠的时间 休眠时间 2020 3 18 40 41 includeintgetitimer intwhich structitimerval value intsetitimer intwhich conststructitimerval value structitimerval ovalue ITIMER REAL 以实际时间为单位进行计时 当给定的时间到时后 内核向进程发送SIGALRM信号ITIMER VIRTUAL 以进程在用户态下的运行时间进行计时 当给定的时间到时后 内核向进程发送SIGVTALRM信号ITIMER PROF 无论一个进程工作于用户态下 还是正处于系统调用过程 都将进行计时 当给定的时间到时后 内核向进程发送SIGPROF信号 间隔定时器 1 2020 3 18 41 42 includestructitimerval 下次倒计时值 structtimevalit interval 当前倒计时值 structtimevalit value it interval的值为0 定时器超时后不再重新自动启动it value值为0 定时器将停止工作并且不重新自动启动ovalue不为空 则setitimer返回设置前的定时器的时间 间隔定时器 2 2020 3 18 42 43 includeFILE fopen constchar path constchar mode r 打开只读文件 该文件必须存在r 打开可读写的文件 该文件必须存在w 打开只写文件 若文件存在则文件长度清为0 若文件不存在则创建该文件w 打开可读写文件 若文件存在则文件长度清为0 若文件不存在则创建该文件a 以附加的方式打开只写文件 若文件不存在 则创建该文件 反之写入的数据会被追加到文件尾a 以附加的方式打开可读写文件 若文件不存在 则创建该文件 反之写入的数据会被追加到文件尾 2 5文件 2020 3 18 43 44 include include include includeintfclose FILE fp intfflush FILE stream intstat constchar path structstat buf structstat dev tst dev 包含文件的设备ID ino tst ino inode数 mode tst mode 文件保护模式 nlink tst nlink 硬链接数 uid tst uid 文件属主的用户ID gid tst gid 文件属主的组ID dev tst rdev 设备ID 特殊文件 off tst size 文件总大小字节数 blksize tst blksize 文件I O操作的块大小 blkcnt tst blocks 分配的文件块数 time tst atime 上次文件访问时间 time tst mtime 上次文件修改时间 time tst ctime 上次文件状态改变时间 2020 3 18 44 第三章 网络程序中常遇到的典型知识结构体大小的计算数据存储与字节序Linux链表和散列链表函数指针校验用户态下的多定时器的实现 2020 3 18 45 结构体大小的计算 sizeof 注意 编译器的优化操作带来的对结构体进行的字节填充 协议解析出错解决 在协议结构体定义时 明确要求编译器不对结构体进行字节填充在协议结构体定义时 引入某些特殊字段进行人为填充 2020 3 18 46 47 禁止优化对齐的方法 pragmapack 1 禁止对齐 structS charc inti structX pragmapack 结束禁止对齐 structS charc inti attribute packed 告诉gcc取消优化对齐 2020 3 18 数据存储与字节序 主机字节序不同的CPU有不同的字节序类型 整数在内存中保存的顺序 常见的字节序Littleendian 将低序字节存储在起始地址 低地址 80 x86采用 高高低低原则 Bigendian 将高序字节存储在起始地址问题 存在大小端两种不同的字节序的机器 字节存储与位存储顺序不同 在不同类型机器间传递数据时容易发生错乱解决 在不同类型机器间进行数据传输时 采用统一的网络字节序传输方式 网络字节序网络数据在传输时的顺序 TCP IP规定采用Big Endian字节序 2020 3 18 48 49 TCP包头中的位域字节序 0123456789101112131415 C E U A P R S F HeaderLength Reserved W C R C S S Y I doff res R E G K H T N N TCP协议头部第13 14字节 2020 3 18 50 TCP包头中的位域字节序 structS1 小端机 u int16 tres 4 doff 4 fin 1 syn 1 rst 1 psh 1 ack 1 urg 1 ece 1 cwr 1 2020 3 18 Linux链表和散列链表 2020 3 18 51 52 1 Linux内核通用链表 structlist head structlist head next prev structlist user structlist headlist intdata 2020 3 18 53 创建链表 内核定义 list h defineLIST HEAD name structlist headname LIST HEAD INIT name defineLIST HEAD INIT name 2020 3 18 54 添加链表元素 list add tail 2020 3 18 55 链表指针和宿主指针的转换 1 由链表结构地址获得链表宿主数据结构地址 structlist head ptr ptr example struct next 已知的指向链表结构体的指针 structexample struct pnode list entry ptr example struct list p 56 链表指针和宿主指针的转换 2 由链表结构地址获得链表宿主数据结构地址 在list h中 definelist entry ptr type member type char ptr unsignedlong type 0 member structlist head structlist head next prev 57 链表指针和宿主指针的转换 3 由链表结构地址获得链表宿主数据结构地址 definelist entry ptr type member type char ptr unsignedlong type 0 member 1 type 0 将0转型为type类型指针2 type 0 member访问结构中的数据成员3 type 0 member 取出数据成员member的地址4 unsignedlong type 0 member 结果转换类型 也就是member所在结构实例的偏移地址 是一个unsignedlong型的数5 char ptr 将宿主中list的地址转换为char 型 便于按字节进行计算6 ptr中的地址 list所在该宿主中的偏移 该宿主的首地址的数值7 对6步的结果进行 type 转型 获得宿主首地址 58 Linux内核通用哈希链表 hashcode 0 structhlist head structhlist node 2020 3 18 59 哈希链表的定义 structhlist head 哈希表头 structhlist node first structhlist node 哈希表节点 structhlist node next pprev 2020 3 18 60 创建哈希链表 structhlist headhtable 64 structhlist user struthlist nodehlist intdata 2020 3 18 61 初始化哈希链表 defineINIT HLIST HEAD ptr ptr first NULL INIT HLIST HEAD 2020 3 18 62 哈希链表操作举例 hash 为所使用的散列函数 intindex hash key structhlist head head 2020 3 18 63 遍历哈希链表 definehlist for each entry tpos pos head member for pos head first pos pos pos next tpos 指向宿主节点的指针 注意不是hlist node类型结构体指针pos 指向hlist node节点的指针 注意不是哈希链表宿主结构体指针head 哈希链表结构体的链表的头指针 注意不是宿主结构体指针member 宿主结构体中作为哈希链表节点而嵌入的成员名hlist entry 原理同list entry 2020 3 18 函数指针 通过函数指针 可在调用接口不变的情况下 动态使用不同的函数实现 可提高程序的灵活性 2020 3 18 64 校验 IP头中有一个字的校验和 为该IP头所有其它字的带进位加 并将进位也加进来 后求反 2020 3 18 65 66 校验和计算示例 1 8bits 8bits 16bits 2020 3 18 67 校验和计算示例 2 0800 0400 1400 6162 6364 E4C6 1B39 2020 3 18 68 校验和计算程序 u16checksum u8 buf intlen u32sum 0 u16 cbuf cbuf u16 buf 将待计算的字节序列转型为u16while len 1 sum cbuf 累加16bit数len 2 剩余尚未累加的16比特的个数 if len 若len的长度不是偶数sum u8 cbuf 用第1个字节补齐 判断是否有16比特加法溢出 若有则将进位位继续累加直到无进位while sum 16 sum sum 16 sum 返回检验和 2020 3 18 用户态下多定时器的实现 用户态下一个进程只能拥有一个间隔定时器如果需要多个定时器 则可以通过软件来实现 69 2020 3 18 70 软件实现多个定时器 定时器1 定时器2 定时器n structsnmp alarm 间隔定时器 thecallback thecallback thecallback thealarms 2020 3 18 第四章 套接字是Linux为用户态应用提供的网络编程接口 套接字分类 流式套接字 面向连接 可靠传输 针对TCP数据报套接字 非连接 不保证可靠 针对UDP 2020 3 18 71 流式套接字程序 SOCK STREAM 服务器程序创建监听套接字 socket 将套接字绑定到指定的地址和端口 bind 开始监听 listen 收到客户端的connect请求后 accept 派生一个子进程进行read和writeshutdown close处理僵死子进程客户端程序创建套接字 socket 无需绑定到固定端口 与服务器的某个端口发出连接请求connect打开会话read write关闭套接字shutdown close 2020 3 18 72 数据报套接字程序 SOCK DGRAM 服务器程序创建监听套接字 socket 绑定到指定地址和端口 bind recvfrom等待客户端发来的数据客户端程序创建套接字sendto发送数据报 2020 3 18 73 1 创建套接字 74 include includeintsocket intdomain inttype intprotocol 参数 Domain 套接字的域名 用于指明所使用的地址族 协议族 types 套接字的类型 SOCK STREAM SOCK DGRAM SOCK RAWProtocol 使用的协议 一般情况下该参数为0 表示由系统在当前设定的domain下 自动选择适合的协议类型返回 Socket描述符 socketdescriptor 2 域和地址族 75 AF AddressFamilyPF ProtocolFamily 其定义在socket h中 defineAF INET2 definePF INETAF INET 目前多用PF 3 套接字地址 不是每个套接字均需要地址无地址的套接字 无名套接字 通常用于本地的不同进程间通信 如socketpair会生成一对互相连接的无名套接字 远程通信的套接字需要地址 2020 3 18 76 通用套接字地址结构sockaddr 77 includetypedefunsignedshortsa family t structsockaddr sa family tsa family charsa data 14 AF Internet IPv4 套接字地址结构sockaddr in 78 includestructsockaddr in sa family tsa family uint16 tsin port structin addrsin addr unsignedcharsin zero 8 sin port与sin addr必须是网络字节序的形式 可使用htonl 等进行转换 使用套接字 2020 3 18 79 1 创建套接字 80 include includeintsocket intdomain inttype intprotocol AF INET 选0表示由系统在当前domain下自动选择适合的协议类型 2 流式套接字连接发起 81 include includeintconnect intsockfd conststructsockaddr in serveraddr intserveraddrlen 将sockfd所指的socket与serveraddr所指的socket相连接 addrlen指serv addr的大小 若sockfd所指socket是SOCK DGRAM类型 则serv addr就是要发向的数据报目的地址 只有此地址可接收数据报 若是SOCK STREAM或SOCK SEQPACKET类型 则将与serveraddr所指的目标建立连接 若成功 返回0 失败 返回 1 并设errno 2 流式套接字连接发起 82 intconnect intsockfd conststructsockaddr in serveraddr intserveraddrlen 常见errno ETIMEDOUT 若客户端TCP在发出首个SYN分段后没有收到任何应答 则大约在调用connect 函数75秒后将返回该错误ECONNREFUSED 当服务器进程并未启动 此时客户端TCP将向客户端应用返回该错误EHOSTUNREACH或ENETUNREACH 若客户端TCP发出的SYN分段收到了途经的中间路由器的 目标不可达 ICMP报文 则客户端TCP会重发SYN分段直到超过75秒 此时客户端TCP向客户端应用返回该错误EALREADY Thesocketisnon blockingandapreviousconnectionattempthasnotyetbeencompleted 3 绑定套接字 83 include includeintbind intsockfd conststructsockaddr in myaddr intaddrlen 将套接字sockfd绑定到本地地址myaddr myaddr长addrlen字节addrlen可以设置为sizeof structsockaddr 不同地址族 其绑定的规则不同对于TCP套接字的地址绑定 若ip地址为INADDR ANY 则将绑定到所有本地IP接口若端口地址设为0 则有内核为其所及选择一个未用的端口若TCP套接字不进行绑定 就执行connect或listen 由内核为其随机设置一个未使用的端口 并将其ip地址设为INADDR ANY一般服务器要明确进行绑定 客户端不显式绑定端口 3 绑定套接字 84 include includeintbind intsockfd conststructsockaddr in myaddr intaddrlen myaddr指定的特殊地址的含义 4 流式套接字连接监听 85 include includeintlisten intsockfd intbacklog 通常通过socket创建的一个套接字若自愿可以接受他人的连接都可以通过listen设置连接队列上限 然后就可以用accept来接受连接 Listen 只能用于SOCK STREAMorSOCK SEQPACKET类型Backlog参数指明已建立连接并等待accept的套接字队列长度 若成功 返回0 失败 返回 1 并设errno 常用errno EADDRINUSE已有一个socket在监听此端口EBADFsockfd无效ENOTSOCKsockfd不是一个socket EOPNOTSUPP此socket的类型不适合使用listen操作 4 流式套接字连接监听 86 include includeintlisten intsockfd intbacklog 对于AF INET地址族 backlog最大值默认为SOMAXCONN 128 5 流式套接字连接接收 87 include includeintaccept intsockfd conststructsockaddr in clientaddr int clientaddrlen 用于面向连接的服务 使用accept从backlog队列中接受下一个连接 对于阻塞socket 若backlog队列为空 则阻塞 进入休眠状态 对于非阻塞socket 则失败 errno设为EAGAINclientaddr不是作为函数的传入参数 而是函数的返回参数若成功 返回一个新的套接字描述符 用于与客户端进行通信 称为连接套接字 原监听套接字继续监听 若失败 返回 1 并设errno 6 套接字I O操作 流式套接字可以像文件一样读写和关闭readwritecloseshutdown数据报套接字读写sendtorecvfrom 2020 3 18 88 读流式套接字 89 includessize tread intsockfd void buf size tcount 从sockfd读入最多count字节到buf所指的缓冲区若count为0 则read returnszeroandhasnootherresults 若count大于SSIZE MAX 则结果不确定 buf 读入数据的缓冲区 count为其长度 代表本次读的最大数据长度函数返回值 实际所读取的数据字节长度 0表示读到文件尾 1表示错误 写流式套接字 90 includessize twrite intsockfd constvoid buf size tcount 向sockfd所指socket写最多count字节 内容为由buf所指的数据缓冲区 函数返回值为实际所写的数据字节长度 0表示什么也没写 1表示出错 并相应设置errno 关闭流式套接字 91 includeintclose intsockfd intshutdown intsockfd inthow close 完全关闭套接字 此sockfd不再使用 相关资源释放 注意 一定要确保没有线程阻塞在recv状态 才能使用close 负责将永远阻塞 通常要采用shutdown关闭所有连接后 再close若成功 返回0 失败 返回 1 并设errno 关闭流式套接字 92 includeintclose intsockfd intshutdown intsockfd inthow how的取值及含义 TCP流式套接字通信模式 93 读数据报套接字 94 include includeintsendto intsockfd 发送方套接字 constvoid msg 发送方数据报缓存指针 intlen 待发送数据报大小 unsignedflags 发送选项 通常为0 conststructsockaddr to 接收方地址 inttolen 接收方地址长度 注意并不能保证这些发送成功的数据一定会被远端数据报套接字正确接收 写数据报套接字 95 include includeintrecvfrom intsockfd 接收方套接字 void buf 接收数据报缓存指针 intlen 接收数据报缓存的大小 unsignedflags 接收选项 通常为0 structsockaddr from 接收方地址 intfromlen 接收方地址长度 函数返回 1则表示出错 并由errno指出错误原因 否则返回buf中实际收到的字节数 UDP数据报套接字通信模式 96 套接字编程常用函数与数据类型 2020 3 18 97 1 字节顺序转换函数 98 includeunsignedlonghtonl unsignedlonghost long unsignedshorthtons unsignedshorthost short unsignedlongntohl unsignedlongnet long unsignedshortntohs unsignedshortnet short 注意 这里短整型表示16位 长整型表示32位 和C语言中的数据类型不一样 h 主机字节序 hostbyteordern 网络字节序 networkbyteorder 字节顺序转换函数举例 99 structsockaddr inadr inet unsignedchar p adr inet sin family AF INET adr inet sin port htons 9000 9000 0 x2328 p char htons 2 地址转换函数 100 include include includeintinet aton constchar string structin addr addr char inet ntoa structin addraddr unsignedlonginet network constchar addr unsignedlonginet lnaof structin addraddr unsignedlonginet netof structin addraddr structin addr uint32 ts addr aton address networkbyteorder lnaof 将以网络字节序表示的ip地址转换为以主机字节序表示的没有网络位的主机ID thelocalhostaddresspartoftheInternetaddressaddr 函数说明 1 intinet aton constchar string structin addr addr 将ip字符串形式的地址string转换为网络字节序32位整型ip地址addr2 char inet ntoa structin addraddr 将32位整型网络字节序ip地址转换为字符串型3 unsignedlonginet network constchar addr 将ip字符串形式的地址转换为主机序32位整型ip地址4 unsignedlonginet lnaof structin addraddr 将以网络字节序表示的ip地址转换为以主机字节序表示的没有网络位的主机ID5 unsignedlonginet netof structin addraddr 将以网络字节序表示的ip地址转换为以主机字节序表示的没有主机位的网络ID 2020 3 18 101 地址转换函数举例 102 structsockaddr inadr inet constchar ip 192 168 9 1 unsignedlongnet addr unsignedlonghost id unsignedlongnet id inet aton ip 3 远程主机信息函数 103 includestructhostent gethostbyname constchar name structhostent hostentrychar h name 主机的正式名称 char h aliases 主机别名列表 inth addrtype 主机地址类型 inth length 地址长度 char h addr list 地址列表 保持后向兼容 defineh addrh addr list 0 以b byte 开头的函数 includevoidbzero void s intn voidbcopy constvoid src void dest intn intbcmp constvoid s1 constvoid s2 intn 以mem开头函数 includevoid memset void s intc size tn void memcpy void dest constvoid src size tn intmemcmp constvoid s1 constvoid s2 size tn 4 字处理函数 2020 3 18 104 bzero 会将参数s所指的内存区域前n个字节 全部设为零值 相当于调用memset void s 0 size tn bcopy 与memcpy 一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址 不过参数src与dest在传给函数时是相反的位置 bcmp 用来比较s1和s2所指的内存区间前n个字节 若参数n为0 则返回0 返回值 若参数s1和s2所指的内存内容都完全相同则返回0值 否则返回非零值 memcmp 功能与其相同 其字符串大小的比较是以ASCII码表上的顺序来决定 次顺序亦为字符的值 memcmp 首先将s1第一个字符值减去s2第一个字符的值 若差为0则再继续比较下个字符 若差值不为0则返回 比较结果相同 返回0 否则非零 函数说明 2020 3 18 105 第五章 本章介绍了Linux网路套接字的有关高级特性及其使用方法 socketoption函数SO RESUSEADDRSO KEEPALIVEI O多路复用信号驱动I Oepoll原始套接字 2020 3 18 106 getsockopt 获得套接字选项当前值 107 includeintgetsockopt intsockfd 套接字intlevel 选项协议层intoptname 选项名void optval 选项接收缓存指针socklen t optlen 选项长度指针 函数返回 1则表示出错 并由errno指出错误原因 否则返回0表示成功 2020 3 18 setsockopt 设置套接字选项 108 includeintsetsock
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 特斯拉玻璃贴膜施工方案
- 2026届辽宁省大连高新区名校联盟化学九年级第一学期期末综合测试试题含解析
- 福建省泉州市鲤城北片区2026届英语九上期末调研试题含解析
- 外挂坐板外墙施工方案
- 市场策划工作总结报告
- 培训工作亮点总结
- 2026届河南省洛阳市涧西区洛阳市九上化学期中复习检测模拟试题含解析
- 2026届山东省济南市中学化学九年级第一学期期末经典模拟试题含解析
- 儿童托管服务政策解读
- 2026届山东省滕州市张汪中学九年级英语第一学期期末监测试题含解析
- 医院死亡报卡培训课件
- catia考试图纸题目及答案
- pos机风险管理办法
- 2025年京东集团招聘笔试指南与面试技巧
- 起重机械定期检查与维护方案
- 2025年行业机器人边缘计算技术应用与场景分析
- 国际物流运输合同(标准版)
- 2025年江西省高考物理真题
- 肝癌的中西医治疗
- 芳华电影介绍模板课件
- 四川省高中信息技术会考试题
评论
0/150
提交评论