關於recvfrom接收超時

2021-07-23 06:41:25 字數 1386 閱讀 5143

標籤: socket

2014-08-18 11:07

671人閱讀收藏

舉報

網路程式設計學習心得

recvfrom,這方法如果不特意設定,預設為阻塞模式,如果一直收不到訊息,那麼會一直阻塞在那裡。

如何設定阻塞時間,或者說如何設定recvfrom接收超時時間。可以使用setsockopt。

setsockopt()

setsockopt(sock, sol_socket, so_rcvtimeo, (char*)&tv, sizeof(timeval));

其中有乙個第三個引數可以設定為so_rcvtimeo,so_sendtimeo。分別可以設定接收超時和傳送超時。那麼之後的第四個和第五個引數即為和時間相關的引數,一般使用timeval結構體。

**示例如下:

wsadata wsadata;

wsastartup(0x0202, &wsadata);

socket sock = socket(af_inet, sock_dgram, ipproto_udp);

if (socket_error == sock)

sockaddr_in addr;

addr.sin_family = af_inet;

addr.sin_port = htons(9999);

addr.sin_addr.s_un.s_addr = inet_addr("192.168.0.31");

int32_t b = bind(sock, (sockaddr*)&addr, sizeof(addr));

if (b)

timeval tv = ;

b = setsockopt(sock, sol_socket, so_rcvtimeo, (char*)&tv, sizeof(timeval));

if (b)

sockaddr_in addr_from;

addr_from.sin_family = af_inet;

int32_t len = sizeof(addr_from);

while (true)

;b = recvfrom(sock, buffer, 1024, 0, (sockaddr*)&addr_from, &len);

if (b <= 0)}

如果超時,那麼recvfrom會返回錯誤碼為10060,解釋為由於連線方在一段時間後沒有正確答覆或連線的主機沒有反應,連線嘗試失敗。

這個時候如果想要控制recvfrom阻塞時間的話,那麼就需要另外採用方法了,我使用的方法是另起乙個執行緒,用於監控最新一次接收訊息的時間(每次收到新訊息即更新一次)和當下系統時間對比,是否超出你的預設超時時間,如果超出,那麼關閉socket即可。

頂 0 踩

0

多程序udp接收recvfrom返回 1原因分析

服務端 include include include include include include include define bufflen 1024 define server port 8888 define backlog 5 define pidnumb 2 static void ...

python 控制接收超時

python 測試接收超時 node2 root test cat connect2.py coding utf 8 import socket import time s socket.socket socket.af inet,socket.sock stream s.settimeout 10...

訊號驅動,超時接收

一 訊號驅動。1 訊號驅動原理是什麼?就是使用了系統程式設計中訊號的機制,首先讓程式安裝sigio的訊號處理函式,通過監聽檔案描述符是否產生了sigio訊號,我們就知道檔案描述符有沒有資料到達。如果有資料到達 小明這個客人來了 則系統就會產生了sigio訊號 門鈴響了 我們只需要在訊號處理函式讀取資...