2011-07-27 84 views
0

我想在2臺計算機上做2路廣播系統。這是我第一次使用C++進行網絡編程。可以說我有計算機A和計算機B,每個計算機上聲明瞭2個套接字,每個計算機和客戶機上都有sd和sd1套接字,每臺計算機上都有服務器聲明。在計算機A上,在計算機A插座SD被綁定到的192.168.2.100:50000計算機A.客戶端IP然後,它使用從廣播計算機B接收信息:2路udp廣播問題,borland turbo C++

recvfrom(sd, (char *)received_buffer, 100, 0, NULL, 0) 

在計算機B,插座SD設置爲廣播使用:

setsockopt(sd, SOL_SOCKET, SO_BROADCAST, (char *)&broadcastpermission, sizeof(struct sockaddr_in)) 

但由於廣播使用sd未綁定。計算機B上,然後用廣播向計算機中的信息:

sendto(sd, (char *)send_buffer, 100, 0, (struct sockaddr *)&server, (int)sizeof(struct sockaddr_in)) 

其中在計算機B上的聲明服務器IP 192.168.2.100:50000(與客戶端的IP在計算機A上,使得其廣播到IP)的。

上述方法在計算機B向計算機A廣播時工作正常。但是,當我試圖以相反方式執行相同操作時,計算機A向計算機B廣播,但它不起作用。在計算機A上,插座SD1聲明,並使用廣播設置:

setsockopt(sd1, SOL_SOCKET, SO_BROADCAST, (char *)&broadcastpermission, sizeof(struct sockaddr_in)) 

和SD1不綁定和計算機A廣播到計算機B使用:

sendto(sd1, (char *)send_buffer, 100, 0, (struct sockaddr *)&server, (int)sizeof(struct sockaddr_in)) 

其中服務器被聲明爲IP 192.168。 2.2:40000(它是計算機B的客戶端IP地址,以便在那裏廣播)。在計算機B上,套接字sd1被聲明並綁定到客戶端,IP地址爲192.168.2.2:40000。計算機B收到的廣播使用:

recvfrom(sd, (char *)received_buffer, 100, 0, NULL, 0) 

我的apolgies長期的故事,但我需要儘可能清楚。任何人都可以告訴計算機B爲什麼不能接收來自計算機A的廣播嗎?

+0

您是否檢查過返回值? setsockopt(... BROADCAST)可能會失敗。如果可能,我會盡量避免廣播。 – harper

回答

0

看來你所描述的是一種溝通方式的作用,而不是另一種。這通常與代碼中的問題無關,而與配置網絡有關,通常是防火牆。

使用嗅探器(如Wireshark)驗證計算機B接收來自計算機A的廣播UDP數據報。如果不是這種情況,請驗證計算機A正在發送正確的UDP數據報。如果A正在發送但B未收到,則存在網絡問題(路由器,防火牆等)。如果B正在接收,但您的應用程序不在,請確認端口號是否正確。您可以在計算機B上使用netstat(與-a -n)以查看是否在正確的端口上打開了UDP套接字。

如果所有這些都不能讓你更接近,請嘗試在兩臺計算機上運行完全相同的程序 - 這意味着不要交換sdsd1角色。相反,在兩臺計算機上運行相同的程序(如果可能的話,運行相同的二進制程序),用嗅探器驗證數據報是否正確接收。然後你可以看到這些程序是否可以互相接收。如果是這種情況,那麼程序B代碼中可能會有一些看不見的東西,導致它發生故障。

最後,使用ping驗證基本實現雙向通信,通過ping從另一個每臺計算機(注意ping沒有確認有效的雙向路徑 - 防火牆通常會阻止傳入的回顯請求,但不回覆)。然後使用常規(非廣播)UDP套接字來驗證UDP通信。這可能是單播是允許的,但廣播不是。