UDP的超時設定

2021-07-13 21:18:46 字數 1584 閱讀 2965

最近在做專案的時候,遇到乙個問題:就是阻塞模式下的udp在接收(recvfrom)的時候,如果沒有收到資料報,程式會一直阻塞。

在windows下可以通過設定超時時間來解決這個問題。

struct timeval timeout;

timeout.tv_sec = 1;

timeout.tv_usec = 0;

::setsockopt(sockserver, sol_socket, so_rcvtimeo, (char *)&timeout, sizeof(timeout));

但是在wince6.0上,上面的**不起效果,然後上網查了一下,可以用select來解決udp的阻塞問題,在wince6.0上也支援。

int

select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const

struct timeval* timeout);

select函式可以監視需要監視的檔案描述符的變化情況,讀寫或是異常。檔案描述符,在windows上即檔案控制代碼,socket就是乙個檔案描述符。

引數列表

int nfds: 是指集合中所有檔案描述符的範圍,即所有檔案描述符的最大值加1,不能錯!在windows中這個引數的值無所謂,可以忽略,通常設定為0。

fd_set* readfds: 需要監視讀變化的檔案描述符的集合,比如需要監視乙個socket的資料接收,就可以將這個socket加入到這個集合中。如果不關心任何檔案描述符的讀變化,可以傳入null。

fd_set* writefds:需要監視寫變化的檔案描述符的集合,比如需要監視乙個socket的資料傳送,就可以將這個socket加入到這個集合中。如果不關心任何檔案描述符的寫變化,可以傳入null。

fd_set* exceptfds:同上面兩個引數類似,監視異常的檔案描述符的集合。

const struct timeval* timeout:設定select的超時時間,

1)傳入null值:將設定select為阻塞狀態,一直等到監視的檔案描述符集合中的某個檔案描述符發生變化;

2)傳入0秒0毫秒:select變成乙個純粹的非阻塞函式,不管檔案描述符是否有變化,都立刻返回繼續執行,檔案無變化返回0,有變化返回乙個正值;

3)timeout的值大於0:就是等待的超時時間,即 select在timeout時間內阻塞,超時時間之內有事件到來就返回了,否則在超時後不管怎樣一定返回;

返回值

< 0:select發生錯誤。

> 0:監視的檔案描述符發生變化。

= 0:等待超時,監視的檔案描述符沒有變化。

udp接收資料報的**

bool recvmsg(char* recvbuf)

else

if(ret == 0)//超時

else

if(ret > 0)

else}}

}return

false;

}

php int 設定超時,php如何設定超時時間

php設定超時的解決方法 1 初始設定指令碼執行時間 開啟php.ini檔案,找到 max execution time 30 修改為 max execution time 600 如果你沒有伺服器修改許可權,可通過內建php指令碼的方法設定超時時間,在需要首席執行官時間操作的php檔案中新增以下 ...

socket 超時設定

在send recv 過程中有時由於網路狀況等原因,收發不能預期進行,而設定收發超時控制 這樣做在linux環境下是不會產生效果的,須如下定義 struct timeval timeout 設定傳送超時 setsockopt socket,sol socket,so sndtimeo,char ti...

設定頁面超時

1.web.config設定 system.web 節裡新增如下配置項 以上時間單位是秒.記得要把 web.config 的 debug 模式關閉 compilation defaultlanguage c debug false 2.單獨某個頁面的超時設定 server.scripttimeout...