TCP/IP网络编程学习笔记(六)
程序员文章站
2022-06-30 18:20:28
...
- 对于
send()
和recv()
函数,其最后一个参数可以指定特别信息。使用MSG_OOB
时表示传输紧急数据,但是只能传输一个字节数据。严格来说是接收端只能接收一个字节的紧急数据,其他数据还是按照正常的方式被接收。MSG_OOB
在发送端很简单,直接用。在接收端,需要使用信号来配合使用,因为接收端会收到SIGURG
的信号,需要注册信号处理函数,并在信号处理函数里面使用recv()
并搭配MSG_OOB
来读取一个字节的紧急信息。此外MSG_OOB
并不会使这一个字节的数据传输的更快,它仍然按照TCP的顺序传输要求来传输,只是告诉接收者有一个特别的数据传输过去了,需要特别处理; - 处理上述的
SIGURG
信号时,一般要指定使用哪个进程来处理,可以使用fcntl()
函数来指定:// 将文件描述符recv_sock所接收到的SIGIO和SIGURG信号的信号处理函数使用processId对应的进程来执行 fcntl(recv_sock, F_SETOWN, processId);
- Windows下没有上述说的信号处理函数,所以在接收端处理
MSG_OOB
消息时,可以使用select()
函数,因为MSG_OOB
消息也属于一种“异常”,因此select()
中的第三个fd_set
参数就可以设置,用来接收并处理MSG_OOB
消息; -
recv()
可以使用MSG_PEEK
,表示正常读取缓冲区里面的数据,但是读取后并不会清空缓冲区,里面的数据还可以被读取。使用这个一般为了查看缓冲区里面是否有目标数据,然后根据缓冲区里面的数据来决定下一步怎么做。此标记一般与MSG_DONTWAIT
一起使用,MSG_DONTWAIT
表示非阻塞读取或写入,可用于写入或读取; - 还有一个
MSG_WAITALL
,只用于recv()
,表示直到全部请求的字节数都接收到时,才会从缓冲区里面读取,不然就阻塞; - 如果想将多个内存数据放到一个数据包里面同时发送给对方,或者想从socket缓冲区里面读取数据并放到不同的内存块里面,那么就可以使用
readv()
和writev()
函数,这样能减少IO操作,提高读写效率。特别是当主动关闭Nagle算法时,使用这两个函数效率就更高。Windows下没有这两个函数,但是可以使用Overlapped I/O
来得到同样的效果。
推荐阅读
-
C#开发之Socket网络编程TCP/IP层次模型、端口及报文等探讨
-
python网络编程学习笔记(九):数据库客户端 DB-API
-
python网络编程学习笔记(10):webpy框架
-
python网络编程学习笔记(六):Web客户端访问
-
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
-
python网络编程学习笔记(五):socket的一些补充
-
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
-
python网络编程学习笔记(四):域名系统
-
python网络编程学习笔记(三):socket网络服务器
-
python网络编程学习笔记(一)