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,如需轉載請自行聯系原作者