首页 > 代码库 > TCP/UDP的一些收发接口的特殊用法

TCP/UDP的一些收发接口的特殊用法

1.UDP使用connect函数和不使用connect函数的区别

 * 不能再使用sendto/recvfrom,而只能使用write/read或send/recv,也就是说不能在收发数据时才指定目的IP

 * 已连接的UDP引发的异步错误会返回给所在的进程,而未连接的UDP不会接收异步错误

 * 已连接的UDP具有较高的收发效率。因为未连接的UDP在收发数据时,需要先执行连接过程,数据收发完成后,再解除连接

 * UDP可以多次调用connect,目的:指定新的IP地址和端口或者也可以是断开连接


2.关于recvfrom/sendto,read/write,recv/send,accept,connect等所有阻塞端口的超时控制的3种方法

 * select 超时退出select.io不仅可以使用select来驱动,还可以使用信号SIGIO来驱动(异步io),当io上发生任何事件时,将会发出该信号

 * alarm  超时将接收到SIGALRM信号,同时当前的阻塞端口返回errno==EINTR错误

 * setsockopt 设置socket选项:SO_RCVTIMEO/SO_SNDTIMEO 

 非阻塞的设置:

 int val=fcntl(fd,F_GETFL,0);

 fcntl(fd,F_SETFL,val|O_NONBLOCK);

3.关于recvfrom/sendto,read/write,recv/send读写接口的参数flags标志

 * 0  没有任何特殊意义

 * MSG_DONTROUTE  收发数据时,无需执行路由查找,告知路由就在局域网之内

 * MSG_DONTWAIT   仅本次执行非阻塞收发操作

 * MSG_OOB        指明收发带外数据,TCP连接上只有一个字节可以作为带外数据发送

 * MSG_PEEK       只对收数据有用,查看缓存中已经可读的数据的多少

 * MSG_WAITALL    只对收数据有用,读取到指定数目的数据才返回000


4.聚合与分散 readv/writev函数:可以对任何文件描述符进行操作

#include <sys/uio.h>

size_t readv(int fd,const struct iovec *iov,int iovcnt);

size_t writev(int fd,const struct iovec *iov,int iovcnt);  //若成功则返回读入和写出的字节数,失败返回-1

struct iovec{

void *iov_base; //starting address of buffer

size_t iov_len; //sizeof of buffer

}

本文出自 “tech记录” 博客,谢绝转载!

TCP/UDP的一些收发接口的特殊用法