教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 教学研究 >

第十讲 高级网络编程

来源:网络收集 时间:2026-08-16
导读: Linux高级编程系列演讲文档 高级网络编程 Linux高级编程系列演讲文档 超时socket 以alarm信号的方式中断阻塞函数 设置socket属性为SO_RCVTIMEO SO_SNDTIMEO 套接字API参数设置为MSG_DONTWAIT 设置socket为非阻塞 用select的最后一个参数控制socket的超时 超

Linux高级编程系列演讲文档

高级网络编程

Linux高级编程系列演讲文档

超时socket 以alarm信号的方式中断阻塞函数 设置socket属性为SO_RCVTIMEO SO_SNDTIMEO 套接字API参数设置为MSG_DONTWAIT 设置socket为非阻塞 用select的最后一个参数控制socket的超时 超时返回时一般会把errno设置为EAGAIN

Linux高级编程系列演讲文档

recv/send的flags参数 read/write函数也可用于接收发送网络数据 recv/send的第四个参数flags增强了socket的 功能。 flags参数也同样存在于recvfrom、recvmsg、 sendto、sendmsg flags参数要么0,要么是各种flag或操作的集合。

Linux高级编程系列演讲文档

flags参数 MSG_DONTWAIT 调用socket函数时,把socket描述符转为非阻塞,返回时在设置成阻塞。如果此时socket中无数据或者发送缓冲区没有足够空间。接收或者发送函数 直接返回,errno会设置为EAGAIN

MSG_NOSIGNAL 当send函数操作被重置的面向链接的socket时,系统不产生 SIGPIPE,但是errno仍会被设置为 EPIPE MSG_OOB 发送或者接受out-of-band数据,又称带外数据或者紧急数据。 MSG_PEEK 从socket的接收队列的头部接受数据,但这些数据并不会从队列中移 除。因此后续的接收动作仍然都接收到这些数据。 MSG_WAITALL recv函数一直会被阻塞,直到请求被满足。但信号,socket被对端 重置仍能导致recv函数在未满足请求的情况下返回。

Linux高级编程系列演讲文档

Unix域套接字 Unix域协议并非真正的协议族 Unix域套接字用来在同一台主机上不同进程间通 讯。 Unix域套接字的API跟TCP/IP套接字API相同。 Unix域套接字支持流套接字和数据包套接字 Unix域套接字的速度比TCP/IP的快2倍左右 Unix域套接字用文件系统中的文件来标识

Linux高级编程系列演讲文档

无名unix域套接字#include <sys/types.h> #include <sys/socket.h> int socketpair(int domain, int type, int protocol, int sv[2]);

创建两个全双工且已经链接的unix域套接字 domain跟socket函数的第一个参数类似,但必 须为FP_LOCAL protocol必须为0 type为SOCK_STREAM或SOCK_DGRAM 用于亲缘进程间通讯 全双工

Linux高级编程系列演讲文档

Unix域套接字#include <sys/socket.h> #include <sys/un.h> #define UNIX_PATH_MAX 108

struct sockaddr_un { sa_family_t sun_family; /* AF_LOCAL */ char sun_path[UNIX_PATH_MAX]; /* pathname */ };

地址结构为sockaddr_un,以sun_path作为标 识。 标识Unix域套接字的路径不能真实的存在于文件 系统中 socket domain为PF_LOCAL, address family 为AF_LOCAL

Linux高级编程系列演讲文档

Linux高级编程系列演讲文档

Unix域套接字 与unix域套接字绑定的文件不能在调用bind前存在 Unix域套接字的文件由bind函数创建,权限为0777 “减去” umask值 跟Unix域关联的路径必须是绝对路径,否则会引入不可知的问题。 调用connect时,参数中的路径已经有一个unix域套接字在其上打开。 路径名的权限决定了调用者是否有权限链接该unix域套接字。 Unix域

的流套接字和数据报套接字分别与TCP和UDP类似。Unix域 流套接字提供没有边界的字节流接口,数据报套接字提供基于记录接口。 两种类型的unix域套接字都是可靠的 当调用send和connect函数时,内核并不会绑定一个临时路径到 socket上。 调用close之后,域unix套接字关联的路径名并不会消失。 实例 un_server.c/un_client.c

Linux高级编程系列演讲文档

描述符操作函数fcntl#include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg);

用来改变fd属性,操作描述符 cmd说明操作类型 F_GETFD 读取 close-on-exec,如果FD_CLOEXEC 是0,那么即使执行了exec,打开的描述符也会被保留。 F_SETFD 设置close-on-exec,值在arg中说明 F_DUPFD 跟dup函数类似,复制描述符fd,新描述符 必须 >= arg。新旧描述符共享文件锁,文件指针,但不 共享close-on-exec,新描述符的FD_CLOEXEC是0

Linux高级编程系列演讲文档

F_GETFL 读取描述符的属性,这个属性就是 open的第二个参数flag F_SETFL 设置描述符的属性,可以被动态改变的 属性有 O_APPEND,O_NONBLOCK,O_ASYNC,O_ DIRECT F_GETOWN 获取接收SIGIO和SIGURG信号 的进程ID或者进程组,进程组用复数表示 F_SETOWN 设置接收SIGIO和SIGURG信号 的进程ID或者进程组,进程组用复数表示

Linux高级编程系列演讲文档

TCP带外数据 带外数据又称加速数据 通信的一方发生紧急事件,并希望对方知道 带外数据的优先级高于普通数据 UDP没有带外数据 TCP有带外数据 带外数据可用来做心跳

Linux高级编程系列演讲文档

TCP带外数据实现

TCP带外数据传送时与普通数据共享同一条链接 带外数据只能有一个字节, send(fd,”a”,1,MSG_OOB) 带外数据放入TCP发送缓冲区的末尾 下一个TCP报文中,TCP头部标识位设置URG 时,表示TCP有紧急数据 同时设置TCP头中的紧急指针

Linux高级编程系列演讲文档

TCP带外数据实现 紧急数据并不一定随TCP紧急头部一起发送(设置 了URG位和紧急偏移) TCP 流量控制 接收端收到标有URG的TCP头部时,判断是否是 新的带外数据(网络会有重复报文) 有新的带外数据到达时,内核向socket的属主进 程发送SIGURG信号。 接收进程阻塞在select上时,会导致select返回。 通过MSG_OOB获取一个字节的紧急数据 TCP只维护一个紧急指针,后来的紧急数据会覆盖 之前的紧急数据。

Linux高级编程系列演讲文档

TCP带外数据实现 紧急数据默认情况下不会和普通数据混在一起 TCP专门维护一个字节的紧急数据缓冲 当接收端指明socket属性为SO_OOBINLINE 时,紧急数据不会冲接收缓冲中去除,而是和普通 数据放在一起 当遇到紧急数据时,recv函数就会返回,用 sockatmark来判断是否遇到紧急数据。 实例 oob_serv.c/oob_client.c

Linux高级编程系列演讲文档

epoll vs select select受到打开描述的限制

(FD_SETSIZE), 数目太少。多进程会有不小的开销 epoll支持的描述符数目继续没有限制, 有 /proc/sys/fs/fs-max可看到最大值。 select会扫描所有在集合中的描述符 epoll有内核来触发,只会对可读写的socket调 用回调函数。 epoll不会随着监听描述符的增加而降低效率 epoll有边缘触发(ET)和水平触发(LT)

…… 此处隐藏:1784字,全部文档内容请下载后查看。喜欢就下载吧 ……
第十讲 高级网络编程.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1568599.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)