Socket IO 不正常 - Linux

Frederic avatar
By Frederic
at 2011-09-15T13:57

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 的話,就不會卡住,
但小弟想追查為何會卡住。
----

--
Tags: Linux

All Comments

Joe avatar
By Joe
at 2011-09-19T07:21
我看你有設timeout,把它改成NULL看看.
Suhail Hany avatar
By Suhail Hany
at 2011-09-23T06:42
讀manual, 若 timeout 設為 NULL, 則 select() 可能會
Michael avatar
By Michael
at 2011-09-28T01:50
無窮無盡的等下去....
Yuri avatar
By Yuri
at 2011-09-28T06:50
另一狀況,在執行時 select() 時會回傳 Errno = 9 的錯誤
Megan avatar
By Megan
at 2011-09-29T05:55
errno=9(EBADF)代表非法的 socket 代號
但 udpSd 沒有被 close, shutdown 的情況下,怎麼會出現
EBADF 的錯誤呢? 真是不解啊 !
Delia avatar
By Delia
at 2011-10-02T13:29
你是TCP還是UDP?有沒有bind?
Ursula avatar
By Ursula
at 2011-10-05T03:52
select()傳回EBADF, 有可能是在之前的 recvfrom() 有
Anthony avatar
By Anthony
at 2011-10-08T00:28
ECONNRESET, 檢查一下recvfrom()是否回傳錯誤
Irma avatar
By Irma
at 2011-10-08T15:02
recvfrom 就卡住了,不會 return (設為 blocked 時)
Madame avatar
By Madame
at 2011-10-10T15:55
這處的recvfrom()是整個程式惟一讀取(或send) updSd 的地
Ina avatar
By Ina
at 2011-10-11T16:07
方嗎? 若不是的話, 檢查之前send或recv是否有錯誤
Tristan Cohan avatar
By Tristan Cohan
at 2011-10-13T13:24
若這段程式是在迴圈內, 檢查 cnt<=0 的情況
Genevieve avatar
By Genevieve
at 2011-10-17T06:33
是迴圈裡唯一在處理這個 UDP socket 的地方
由於不會 return, 所以沒機會檢查 cnt<=0 ~><~
Hedwig avatar
By Hedwig
at 2011-10-21T09:03
你好像弄錯意思了, 這是迴圈裡唯一在處理這個udpSd的地方
但是不是總是第一次執行到此處的recvfrom()就被block呢?
Cara avatar
By Cara
at 2011-10-25T07:21
如果不是的話, 要檢查迴圈之前執行到這個recvfrom()是否
Olivia avatar
By Olivia
at 2011-10-27T12:15
有錯誤. 如果總是第一次就被block, 要先確認udpSd是真的
Susan avatar
By Susan
at 2011-10-30T21:48
正確的initialized, 是真的可以用的socket. 若是你確認後
者的方式是把它改成nonblocked, 還是要檢查 recvfrom()是
Isabella avatar
By Isabella
at 2011-11-02T06:18
否有傳回錯誤, 有的話可以幫你找到問題所在
Eartha avatar
By Eartha
at 2011-11-03T10:08
嗯,並不是第一次進 recvfrom 就卡住。
Agatha avatar
By Agatha
at 2011-11-07T17:57
迴圈一直跑,好像在第4~5次時開始卡。一卡就無法往下跑了
Olga avatar
By Olga
at 2011-11-10T14:57
所以 updSockId 原來是可以收封包的,不知什麼原因,
Jack avatar
By Jack
at 2011-11-14T15:23
select 明明告訴我可以去收封包了,但 recvfrom 卻收不到
目前的現像是這樣。懷疑是不是有某 thread 誤把同數字的
Hedwig avatar
By Hedwig
at 2011-11-14T23:38
socket 或 file descriptor 給 shutdown or close 了,
Delia avatar
By Delia
at 2011-11-16T22:59
但追查,沒發現有↑上述現象。真是不解 !
Tracy avatar
By Tracy
at 2011-11-18T09:16
改成 nonblock 的方式叫 recvfrom, 觀察 errno,有兩個值
Mia avatar
By Mia
at 2011-11-18T15:12
1是 EAGAIN (timeout), 2是 88 or 9 表示 sockid 有誤.
Steve avatar
By Steve
at 2011-11-21T22:07
若是在第4~5次才開始卡, 就要檢查前面每一次的recvfrom()
Franklin avatar
By Franklin
at 2011-11-22T23:45
時有沒有錯誤, 也就是檢查 cnt<=0 的情況
Oliver avatar
By Oliver
at 2011-11-23T01:07
還有不同的thread會有可能接收同一個updSd嗎? 有的話也會
Hardy avatar
By Hardy
at 2011-11-23T22:50
造成block的情形 (但不會造成select有EBADF)
Ida avatar
By Ida
at 2011-11-24T23:47
一直查不到有另一個thread 誤讀誤關掉 udpSockId 的動作
Dinah avatar
By Dinah
at 2011-11-29T11:42
對於 select() EBADF 及 recvfrom 卡住,仍然無解...
Jessica avatar
By Jessica
at 2011-11-30T03:32
出現EBADF和 recvfrom卡住時, 不一定是這方的程式誤關掉
Brianna avatar
By Brianna
at 2011-12-03T14:16
socket, 也有可能是遠端關掉此socket. 檢查 "每一次" 的
Robert avatar
By Robert
at 2011-12-06T07:45
select()和recvfrom() 有沒有錯誤, 尤其是在出現 EBADF
和recvfrom卡住之前的那幾次select和recvfrom
Carolina Franco avatar
By Carolina Franco
at 2011-12-09T18:50
出錯前,每一次 select 都是 return >0 or =0
Bennie avatar
By Bennie
at 2011-12-13T05:40
之前的recvfrom()呢?

神奇的回收筒...

Bethany avatar
By Bethany
at 2011-09-14T21:11
: 推 trashprince:我上一次rm .trash 差點把整個home刪了 09/13 22:44 : → trashprince:我的發行版很奇怪 .trash居然指向home 09/13 22:45 我猜不是 .trash 指向 /h ...

請教一下kvm如何切換主機

Heather avatar
By Heather
at 2011-09-14T21:07
※ 引述《Cubicalex (π郎)》之銘言: : 請教各位大大 小弟現在用kvm登入刀鋒伺服器主機 : 刀鋒伺服器共有五刀 如果現在登入後他的位置在第三刀 : 1 我該如何將位置轉到第一刀來? : 2 如果我要將第一刀的資料傳到第三刀 該怎麼做? : 請各位大大指 ...

CentOS 安裝問題

Tristan Cohan avatar
By Tristan Cohan
at 2011-09-14T18:28
想請教安裝 CentOS6 過程中 我選了 minimal,自訂套件 哪些選項該勾取,才會有 wget、rpm、yum 那些東西呢 - ...

Win7/XP iSCSI initiator抓不到Unbuntu 11.04的iSCSI Target

Zenobia avatar
By Zenobia
at 2011-09-14T18:19
我在Ubuntu有做以下設定 軟體安裝 apt-get install iscsitarget 設定檔 vi /etc/ietd.cof Target iqn.2010-10.com.ec:storage.data1t.iscsi.data01 Lun 0 Path=/dev/sdb,Typ ...

在文字介面下載google doc或是skydrive的檔案??

Michael avatar
By Michael
at 2011-09-14T15:38
因為最近覺得這兩個空間很好用 所以檔案都丟在上面 有時候想要在linux下使用檔案 但是都不知道該怎麼下載 我本來想要用wget 但是失敗了Q_Q 請問有辦法下載嗎?? - ...