2010-07-15 189 views
0

我創建UDP套接字的UDP客戶端,並用不同的端口號發送UDP數據包,並等待來自目的地一定的時間答覆。客戶端UDP套接字綁定

我的疑問是..是否有可能重新綁定一個UDP套接字多個端口號(甚至IP地址)相同的插座FD沒有關閉套接字? (我不能使用原始套接字:()

EDIT1:我試圖綁定同一個IP地址和端口號兩個不同的插座文件描述符,但我會有不同的結果。(對於這兩個插座文件描述符我設置。SO_REUSEADDR選項)

在Linux內核2.6.8

第一插口FD - 成功綁定

第二插座FD:返回錯誤98在使用中說地址已經

在Linux內核2.6.24

第一插口FD:成功

第二插座FD結合:成功

回答

0

結合嘗試在一組開放套接字的使用select()

+0

Hmm select()只能在打開的多個插座上使用,但不能在單個SOCKET FD上使用:( – codingfreak 2010-07-15 05:25:37

+0

@codingfreak:每個偵聽套接字都需要自己的FD。在每個端口/地址對上打開一個套接字然後'select'在循環中找到下一個讀 – Borealid 2010-07-15 08:24:54

+1

@codingfreak:這是完全可以使用'選擇()'上只有一個插座FD – che 2010-07-15 09:50:19

1

我懷疑是否有可能重新綁定一個UDP套接字到多個端口號(甚至IP地址)到同一個套接字FD沒有關閉套接字?

看來,POSIX has that now officially as unsupported,報價:的bind()函數應當向由已分配沒有本地套接字地址描述插座確定了插座分配一個本地套接字地址地址。

在過去,我已經聽說,重新綁定()ING是可能在某些平臺上,但我個人從來沒有使用過這一點。

難道還有比這以外的任何最好的解決辦法???

保留打開的UDP套接字的緩存,使用poll()的套接字用於IO多路複用和超時處理。

0

要做到這一點,你可以使用一個UDP套接字bonud一個端口接收的數據和其他(綁定到不同的端口)做的發送。

+0

這不是我的情況很好的解決方案..因爲我有。在同一個套接字上發送和接收數據......似乎select()真的會幫助我。 – codingfreak 2010-07-21 03:23:01