當前位置:首頁 » 操作系統 » recvlinux

recvlinux

發布時間: 2023-09-05 23:25:42

linux中C語言的一個函數的源代碼:socket 編程中的 recv() 函數。

1、recv是socket編程中最常用的函數之一,在阻塞狀態的recv有時候會返回不同的值,而對於錯誤值也有相應的錯誤碼,分別對應不同的狀態。
2、recv函數只是在用戶空間定義的。內核空間有與之對應的函數,也就是說,執行recv函數就會調用到內核中與它對應的函數,實際起作用的就是內核里的這個函數。至於內核里調用的是那個函數,內核里的調用關系復雜的很,除非對內核非常了解的,才會找到到底是怎麼調用的,他也是只是找到怎麼調用的。

❷ linux socket阻塞recv怎麼返回

recv是socket編程中最常用的函數之一,在阻塞狀態的recv有時候會返回不同的值,而對於錯誤值也有相應的錯誤碼,分別對應不同的狀態,下面是我針對常見的幾種網路狀態的簡單總結。
首先阻塞接收的recv有時候會返回0,這僅在對端已經關閉TCP連接時才會發生。
而當拔掉設備網線的時候,recv並不會發生變化,仍然阻塞,如果在這個拔網線階段,socket被關掉了,後果可能就是recv永久的阻塞了。
所以一般對於阻塞的socket都會用setsockopt來設置recv超時。
當超時時間到達後,recv會返回錯誤,也就是-1,而此時的錯誤碼是EAGAIN或者EWOULDBLOCK,POSIX.1-2001上允許兩個任意一個出現都行,所以建議在判斷錯誤碼上兩個都寫上。
如果socket是被對方用linger為0的形式關掉,也就是直接發RST的方式關閉的時候,recv也會返回錯誤,錯誤碼是ENOENT
還有一種經常在代碼中常見的錯誤碼,那就是EINTER,意思是系統在接收的時候因為收到其他中斷信號而被迫返回,不算socket故障,應該繼續接收。但是這種情況非常難再現,我嘗試過一邊一直在不停的發信號,一邊用recv接收數據,也沒有出現過。這種異常錯誤我附近只有一個朋友在用write的時候見到過一次,但是總是會有概率出現的,所以作為完善的程序必須對此錯誤進行特殊處理。
一般設置超時的阻塞recv常用的方法都如下:
while(1)
{
cnt = (int)recv(m_socket, pBuf,RECVSIZE, 0);
if( cnt >0 )
{
//正常處理數據
}
else
{
if((cnt<0) &&(errno == EAGAIN||errno == EWOULDBLOCK||errno == EINTR)) //這幾種錯誤碼,認為連接是正常的,繼續接收
{
continue;//繼續接收數據
}
break;//跳出接收循環
}
}
阻塞與非阻塞recv返回值沒有區分,都是 <0 出錯 =0 連接關閉 >0 接收到數據大小。

Linux環境下,須如下定義:struct timeval timeout = {3,0};
//設置發送超時
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
//設置接收超時
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));

❸ WINDOWS下的send,recv與LINUX下的send,recv有什麼區別

1、recv和send函數提供了和read和write差不多的功能。但是他們提供了第四個參數來控制讀寫操作.int recv(int sockfd,void *buf,int len,int flags)
int send(int sockfd,void *buf,int len,int flags)
前面的三個參數和read,write相同,第四個參數能夠是0或是以下的組合:
_______________________________________________________________
| MSG_DONTROUTE | 不查找路由表 |
| MSG_OOB | 接受或發送帶外數據 |
| MSG_PEEK | 查看數據,並不從系統緩沖區移走數據 |
| MSG_WAITALL | 等待任何數據 |
|————————————————————–|
如果flags為0,則和read,write一樣的操作。
2、在unix中,所有的設備都可以看成是一個文件,所以我們可以用read來讀取socket數據。

熱點內容
微信少兒編程 發布:2025-03-04 21:12:45 瀏覽:190
lol伺服器連不上怎麼辦 發布:2025-03-04 20:56:13 瀏覽:676
米俠裡面的腳本有什麼用 發布:2025-03-04 20:52:22 瀏覽:588
xmlmd5加密 發布:2025-03-04 20:52:22 瀏覽:811
我的世界搜不到租賃伺服器 發布:2025-03-04 20:40:09 瀏覽:551
c創建sqlite資料庫 發布:2025-03-04 20:29:45 瀏覽:893
我的世界手游版怎麼做伺服器 發布:2025-03-04 19:52:22 瀏覽:944
浪潮存儲知識 發布:2025-03-04 19:50:07 瀏覽:579
網上開戶賬號密碼是什麼 發布:2025-03-04 19:48:40 瀏覽:499
pcftpps3 發布:2025-03-04 19:39:55 瀏覽:494