天天看點

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

}

本文轉自 a_liujin 51CTO部落格,原文連結:http://blog.51cto.com/a1liujin/1871461,如需轉載請自行聯系原作者

繼續閱讀