socket、 send、recv、阻塞相關

一、recv和recvfrom的區別
原文鏈接: http://blog.csdn.net/jiangzhuzhu/article/details/5686517
2015.3.02   2015.8.18
 2387人閱讀 評論(0) 收藏 舉報

recv不等待是因爲你使用的是非阻塞socket,換而你使用阻塞socket一樣需要等待。 
recv的recvfrom是可以替換使用的,只是recvfrom多了兩個參數,可以用來接收對端的地址信息,這個對於udp這種無連接的,可以很方便地進行回覆。而換過來如果你在udp當中也使用recv,那麼就不知道該回復給誰了,如果你不需要回復的話,也是可以使用的。另外就是對於tcp是已經知道對端的,就沒必要每次接收還多收一個地址,沒有意義,要取地址信息,在accept當中取得就可以加以記錄了。




socket編程

原文鏈接: http://blog.csdn.net/jiangzhuzhu/article/details/5687234

 

socket編程

分類: linux 264人閱讀 評論(0) 收藏 舉報

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)



三、非阻塞socket編程處理EAGAIN

原文鏈接:http://blog.chinaunix.net/uid-25885064-id-3067050.html

分類: C/C++

      在linux進行非阻塞的socket接收數據時經常出現Resource temporarily unavailable,errno代碼爲11(EAGAIN),這表明你在非阻塞模式下調用了阻塞操作,在該操作沒有完成就返回這個錯誤,這個錯誤不會破壞socket的同步,不用管它,下次循環接着recv就可以。 對非阻塞socket而言,EAGAIN不是一種錯誤。在VxWorks和Windows上,EAGAIN的名字叫做EWOULDBLOCK。

      另外,如果出現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、判別方法

附下圖 說明 是 阻塞 還是非阻塞 問題:



五、






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章