recv不等待是因爲你使用的是非阻塞socket,換而你使用阻塞socket一樣需要等待。
recv的recvfrom是可以替換使用的,只是recvfrom多了兩個參數,可以用來接收對端的地址信息,這個對於udp這種無連接的,可以很方便地進行回覆。而換過來如果你在udp當中也使用recv,那麼就不知道該回復給誰了,如果你不需要回復的話,也是可以使用的。另外就是對於tcp是已經知道對端的,就沒必要每次接收還多收一個地址,沒有意義,要取地址信息,在accept當中取得就可以加以記錄了。
原文鏈接: http://blog.csdn.net/jiangzhuzhu/article/details/5687234
int socket(int domain,int type,int protocol);
(1):如果想單獨處理TCP,UDP或者ICMP,可用AF_INET, 第三個參數用IPPROTO_TCP, IPPROTO_UDP等
(2):如果想對各種IP包進行處理,則用AF_PACKET/PF_PACKET,第三個參數用htons(ETH_P_IP)
(3):如果想處理一切鏈路層上的包(IP,RARP,ARP等),則用AF_PACKET/PF_PACKET,第三個參數用 htons(ETH_P_ALL)
分類: C/C++
另外,如果出現EINTR即errno爲4,錯誤描述Interrupted system call,操作也應該繼續。
最後,如果recv的返回值爲0,那表明連接已經斷開,我們的接收操作也應該結束。
四、阻塞 非阻塞 判別
1、非阻塞的設置方法
原文鏈接:http://blog.sina.com.cn/s/blog_4b029ef30100nxcb.html
int flag;
flag = fcntl(fd, F_GETFL, 0);
if(0 > flag) .......;
flag |= O_NONBLOCK;
fcntl(fd, F_SETFL, flag);
2、判別方法
附下圖 說明 是 阻塞 還是非阻塞 問題:五、