Socket IO 不正常 - Linux

Table of Contents

小弟有個 socket 程式在收封包時會卡住的問題,想請問大家,

程式片段 ==>

01: FD_ZERO(&readList);
02: FD_SET(udpSd, &readList);
03:
04: rc = select(maxfd1, &readList, NULL, NULL, wait_time, 0);
05: if (rc > 0) {
06: if (FD_ISSET(udpSd, &readList))
07: {
08: cnt = recvfrom(udpSd, udpBuf, SZ_UDP_BUF, 0, &from_addr, &from_len);
09: if (cnt > 0) {
10: .....
11: }
12: }
13: ...
14: }

此片段是某個 thread 會執行到的一段程式碼。

在執行時會卡在第8行,無法從 recvfrom 回來。

雖然在第8行,給 recvfrom 的 flag 是 0,表示是 blocked 的 socket,
然透過第4行的 select() 叫用,
應該是不會讓 recvfrom 因收不到 data 而卡住才對。

請教大家,發生 recvfrom 卡住的狀況其可能原因為何呢 ?

----
ps: 試過第8行的 flag 指定為 nonblocked 的話,就不會卡住,
但小弟想追查為何會卡住。
----

--

All Comments

Joe avatarJoe2011-09-19
我看你有設timeout,把它改成NULL看看.
Suhail Hany avatarSuhail Hany2011-09-23
讀manual, 若 timeout 設為 NULL, 則 select() 可能會
Michael avatarMichael2011-09-28
無窮無盡的等下去....
Yuri avatarYuri2011-09-28
另一狀況,在執行時 select() 時會回傳 Errno = 9 的錯誤
Megan avatarMegan2011-09-29
errno=9(EBADF)代表非法的 socket 代號
但 udpSd 沒有被 close, shutdown 的情況下,怎麼會出現
EBADF 的錯誤呢? 真是不解啊 !
Delia avatarDelia2011-10-02
你是TCP還是UDP?有沒有bind?
Ursula avatarUrsula2011-10-05
select()傳回EBADF, 有可能是在之前的 recvfrom() 有
Anthony avatarAnthony2011-10-08
ECONNRESET, 檢查一下recvfrom()是否回傳錯誤
Irma avatarIrma2011-10-08
recvfrom 就卡住了,不會 return (設為 blocked 時)
Madame avatarMadame2011-10-10
這處的recvfrom()是整個程式惟一讀取(或send) updSd 的地
Ina avatarIna2011-10-11
方嗎? 若不是的話, 檢查之前send或recv是否有錯誤
Tristan Cohan avatarTristan Cohan2011-10-13
若這段程式是在迴圈內, 檢查 cnt<=0 的情況
Genevieve avatarGenevieve2011-10-17
是迴圈裡唯一在處理這個 UDP socket 的地方
由於不會 return, 所以沒機會檢查 cnt<=0 ~><~
Hedwig avatarHedwig2011-10-21
你好像弄錯意思了, 這是迴圈裡唯一在處理這個udpSd的地方
但是不是總是第一次執行到此處的recvfrom()就被block呢?
Cara avatarCara2011-10-25
如果不是的話, 要檢查迴圈之前執行到這個recvfrom()是否
Olivia avatarOlivia2011-10-27
有錯誤. 如果總是第一次就被block, 要先確認udpSd是真的
Susan avatarSusan2011-10-30
正確的initialized, 是真的可以用的socket. 若是你確認後
者的方式是把它改成nonblocked, 還是要檢查 recvfrom()是
Isabella avatarIsabella2011-11-02
否有傳回錯誤, 有的話可以幫你找到問題所在
Eartha avatarEartha2011-11-03
嗯,並不是第一次進 recvfrom 就卡住。
Agatha avatarAgatha2011-11-07
迴圈一直跑,好像在第4~5次時開始卡。一卡就無法往下跑了
Olga avatarOlga2011-11-10
所以 updSockId 原來是可以收封包的,不知什麼原因,
Jack avatarJack2011-11-14
select 明明告訴我可以去收封包了,但 recvfrom 卻收不到
目前的現像是這樣。懷疑是不是有某 thread 誤把同數字的
Hedwig avatarHedwig2011-11-14
socket 或 file descriptor 給 shutdown or close 了,
Delia avatarDelia2011-11-16
但追查,沒發現有↑上述現象。真是不解 !
Tracy avatarTracy2011-11-18
改成 nonblock 的方式叫 recvfrom, 觀察 errno,有兩個值
Mia avatarMia2011-11-18
1是 EAGAIN (timeout), 2是 88 or 9 表示 sockid 有誤.
Steve avatarSteve2011-11-21
若是在第4~5次才開始卡, 就要檢查前面每一次的recvfrom()
Franklin avatarFranklin2011-11-22
時有沒有錯誤, 也就是檢查 cnt<=0 的情況
Oliver avatarOliver2011-11-23
還有不同的thread會有可能接收同一個updSd嗎? 有的話也會
Hardy avatarHardy2011-11-23
造成block的情形 (但不會造成select有EBADF)
Ida avatarIda2011-11-24
一直查不到有另一個thread 誤讀誤關掉 udpSockId 的動作
Dinah avatarDinah2011-11-29
對於 select() EBADF 及 recvfrom 卡住,仍然無解...
Jessica avatarJessica2011-11-30
出現EBADF和 recvfrom卡住時, 不一定是這方的程式誤關掉
Brianna avatarBrianna2011-12-03
socket, 也有可能是遠端關掉此socket. 檢查 "每一次" 的
Robert avatarRobert2011-12-06
select()和recvfrom() 有沒有錯誤, 尤其是在出現 EBADF
和recvfrom卡住之前的那幾次select和recvfrom
Carolina Franco avatarCarolina Franco2011-12-09
出錯前,每一次 select 都是 return >0 or =0
Bennie avatarBennie2011-12-13
之前的recvfrom()呢?