欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TCP/IP网络编程学习笔记(六)

程序员文章站 2022-06-30 18:20:28
...
  1. 对于send()recv()函数,其最后一个参数可以指定特别信息。使用MSG_OOB时表示传输紧急数据,但是只能传输一个字节数据。严格来说是接收端只能接收一个字节的紧急数据,其他数据还是按照正常的方式被接收。MSG_OOB在发送端很简单,直接用。在接收端,需要使用信号来配合使用,因为接收端会收到SIGURG的信号,需要注册信号处理函数,并在信号处理函数里面使用recv()并搭配MSG_OOB来读取一个字节的紧急信息。此外MSG_OOB并不会使这一个字节的数据传输的更快,它仍然按照TCP的顺序传输要求来传输,只是告诉接收者有一个特别的数据传输过去了,需要特别处理;
  2. 处理上述的SIGURG信号时,一般要指定使用哪个进程来处理,可以使用fcntl()函数来指定:
    // 将文件描述符recv_sock所接收到的SIGIO和SIGURG信号的信号处理函数使用processId对应的进程来执行
    fcntl(recv_sock, F_SETOWN, processId);
    
  3. Windows下没有上述说的信号处理函数,所以在接收端处理MSG_OOB消息时,可以使用select()函数,因为MSG_OOB消息也属于一种“异常”,因此select()中的第三个fd_set参数就可以设置,用来接收并处理MSG_OOB消息;
  4. recv()可以使用MSG_PEEK,表示正常读取缓冲区里面的数据,但是读取后并不会清空缓冲区,里面的数据还可以被读取。使用这个一般为了查看缓冲区里面是否有目标数据,然后根据缓冲区里面的数据来决定下一步怎么做。此标记一般与MSG_DONTWAIT一起使用,MSG_DONTWAIT表示非阻塞读取或写入,可用于写入或读取;
  5. 还有一个MSG_WAITALL,只用于recv(),表示直到全部请求的字节数都接收到时,才会从缓冲区里面读取,不然就阻塞;
  6. 如果想将多个内存数据放到一个数据包里面同时发送给对方,或者想从socket缓冲区里面读取数据并放到不同的内存块里面,那么就可以使用readv()writev()函数,这样能减少IO操作,提高读写效率。特别是当主动关闭Nagle算法时,使用这两个函数效率就更高。Windows下没有这两个函数,但是可以使用Overlapped I/O来得到同样的效果。