在socket程式設計中,經常使用recv函式阻塞等待接收資料。
如果對方gg了(接收到你的資料之後並沒有返回,你這裡會一直等待下去),顯然我們是不希望出現這種情況的。
一般情況下,考慮到對方的資料處理時間,我們可以設定乙個超時時間,比如10s,10s之後如果對方還沒返回訊息,我們就應該做相應的處理。
核心**:
struct timeval tv_out;
tv_out.tv_sec =5;
tv_out.tv_usec =0;
setsockopt
(socket, sol_socket, so_rcvtimeo,
&tv_out,
sizeof
(tv_out)
);
下方是乙個demo,其中使用了ulog元件可以方便的檢視日誌時間,我們把超時時間設定的5s,可以看到server監聽後,socket號為1的客戶端連線上了,我們設定5s超時時間,開始接收:
(1)一直沒有資料發過來,5s時間之後,我們recv超時返回-1,接下來我們進行相應操作,主動斷開這個連線;
(2)如果有資料發過來,recv返回資料長度,進行正確資料處理後繼續recv,此時又重新開始5s倒計時;
(3)如果等待過程中客戶端主動關閉socket連線,那麼recv返回0,進行退出操作。
/* 初始化預連線的服務端位址 */
listen_addr.sin_family = af_inet;
listen_addr.sin_port =
htons
(port)
; listen_addr.sin_addr =*(
(struct in_addr *
) host->h_addr)
; listen_addr.sin_addr.s_addr = netdev->ip_addr.addr;
rt_memset(&
(listen_addr.sin_zero),0
,sizeof
(listen_addr.sin_zero));
if(bind
(sock_listen,
(struct sockaddr *
)&listen_addr,
sizeof
(struct sockaddr)
)<0)
listen
(sock_listen,3)
;log_d
("begin listing...");
while(1
)char tid_name[10]
="cli"
;char tid_num[10]
;itoa
(sock_connect, tid_num,10)
;strcat
(tid_name, tid_num)
;struct client_info *client;
client =
rt_malloc
(sizeof
(struct client_info));
client->socketnum = sock_connect;
rt_memcpy
(&client->addr,
&connect_addr,
sizeof
(struct sockaddr_in));
client->sockaddrlen = sin_size;
tid =
rt_thread_create
(tid_name, client_thread_entry,
(void
*) client,
4096,25
,10);
if(tid == rt_null)
rt_thread_startup
(tid);}
__exit:
log_d
("close listener...");
/* 關閉這個 socket */
closesocket
(sock_listen)
;return;}
msh_cmd_export
(tcpserver, tcpserver)
;
php int 設定超時,php如何設定超時時間
php設定超時的解決方法 1 初始設定指令碼執行時間 開啟php.ini檔案,找到 max execution time 30 修改為 max execution time 600 如果你沒有伺服器修改許可權,可通過內建php指令碼的方法設定超時時間,在需要首席執行官時間操作的php檔案中新增以下 ...
給XMLHttpRequest設定超時時間
在web開發中,經常要用到ajax技術,有時因為功能很簡單,不想利用現成的框架,就只是想利用xmlhttprequest來手動處理ajax功能,這時,會遇到乙個很現實的問題,就是ajax請求的超時問題。如果我們利用jquery這樣的框架,是可以直接設定超時時間的,但是xmlhttprequest物件...
設定ssh超時時間
方法一 最近公司剛剛買了一台hyper v的vps,但是連線ssh伺服器剛剛離開一會就斷開,不得不需要反覆連線伺服器,為了使ssh伺服器可以保持足夠的連線時間,大家可以按以下方法設定 基於安全的理由,如果使用者連線到 ssh server 後閒置,ssh server 會在超過特定時間後自動終止 s...