2013-01-02 38 views
2


這裏是我想要做的事情:
我有4個時鐘和一臺PC在網絡上。我(PC)想要從任何時鐘獲得時間。UDP套接字,選擇多個客戶端之一

思路:
每個時鐘都使用UDP廣播(廣播,因爲我不知道PC的IP)。個人電腦獲得第一個數據集(時間),從那時起只查看該時鐘的數據集。 (沒得到由輕微timedifferences時鐘之間的混淆)

時鐘=客戶:
- 插座
- 綁定到端口1234
- SENDTO(廣播, '1234')

PC =服務器
- 插座
- 綁定到端口1234
- recvfrom的(數據,client_addr)//提取從第一client_addr接收數據
- 連接(client_addr)//只從該客戶機接收數據
- recvfrom的()

1:這是做到這一點的正確方法是什麼?還是有更好的選擇?

2:我能做些什麼,如果我想在PC上的多個應用程序來獲取時間的數據?我可以複製代碼並使用它嗎?我的印象是,端口1234現在被第一個綁定的應用程序阻止。 (我猜SO_REUSEADDR不會起作用,因爲只有一個應用程序,然後獲取數據,我不知道這將是其中之一)

問候

+0

我不確定你的應用程序是什麼,但它聽起來像它可能是ptpd所做的 - 精確地同步局域網內的時鐘。如果是這樣,也許你想運行ptpd? –

+0

@JeremyFriesner:謝謝你的提示!看起來像是需要思考的東西。 – Michael

回答

2

1:這是正確的方法做這個?

是的。

還是有更好的選擇?

可沒想到一個副手的。

2:如果我想讓PC上的多個應用程序獲取時間數據,我該怎麼辦?

使用SO_REUSEADDR

可我只是將代碼複製並使用它?

是的。

我的印象是,該端口1234現已被攔截,從獲取的綁定的首次應用。

No.

(我猜SO_REUSEADDR不會起作用,因爲只有一個應用程序,然後獲取數據,我不知道這將是其中之一)

錯誤的猜測。爲什麼要猜測呢?爲什麼不嘗試呢?比猜測更可靠,也比在這裏提問更快。

+1

我的猜測是因爲我在msdn上讀到了這個: – Michael

+0

關於SO_REUSEADDR: 「另外,如果兩個套接字綁定到相同的端口,則行爲未定義爲哪個端口將接收數據包。或「第二個套接字成功綁定後,綁定到該端口的所有套接字的行爲是不確定的。」 我現在試了一下,它工作,但我有點擔心穩定性,因爲未定義的行爲。 對此有何想法? – Michael

+0

@Michael由於數據包是以廣播形式傳入的,因此我希望它們能夠傳送給每個人,但是您肯定必須進行測試和驗證。如果這不起作用,你將不得不做其他安排。你可以使用UDP多播而不是廣播嗎? – EJP

相關問題