我寫了一個Java Client,它向廣播地址發(fā)送消息。我還編寫了一個 Java Server,它接受所有發(fā)送的消息并將消息發(fā)送回客戶端。現(xiàn)在我想嘗試在 Go 中做完全相同的事情,只是為了獲得一些經(jīng)驗。服務(wù)器工作正常,正在接收消息并響應(yīng) Java 客戶端。但是我的 Go Client 只向 Go/Java 服務(wù)器發(fā)送消息,但沒有收到任何消息。根據(jù)wireshark的說法,消息被發(fā)送回正確的IP和端口,但顯然該端口無法訪問。我的代碼如下:轉(zhuǎn)到服務(wù)器:package mainimport ( "fmt" "log" "net")func main() { //Resolving address udpAddr, err := net.ResolveUDPAddr("udp4", "0.0.0.0:8888") if err != nil { log.Println("Error: ", err) } // Build listining connections conn, err := net.ListenUDP("udp", udpAddr) defer conn.Close() if err != nil { log.Println("Error: ", err) } // Interacting with one client at a time for { fmt.Println(">>>Ready to receive broadcast packets!") // Receiving a message recvBuff := make([]byte, 15000) _, rmAddr, err := conn.ReadFromUDP(recvBuff) if err != nil { panic(err) } fmt.Println(">>>Discovery packet received from: " + rmAddr.String()) fmt.Println(">>>Packet received; data: " + string(recvBuff)) // Sending the same message back to current client conn.WriteToUDP(recvBuff, rmAddr) fmt.Println(">>>Sent packet to: " + rmAddr.String())} }
2 回答

郎朗坤
TA貢獻(xiàn)1921條經(jīng)驗 獲得超9個贊
即使您只打算從連接發(fā)送 UDP 數(shù)據(jù)包,您通常也希望ListenUDP
使用ReadFromUDP
和WriteToUDP
方法來創(chuàng)建連接。
當(dāng)您使用 時DialUDP
,它會創(chuàng)建一個“連接的”UDP 套接字,帶有一個隱式遠(yuǎn)程端點,它將過濾傳入的數(shù)據(jù)包。從 Linuxconnect
手冊頁:
如果套接字 sockfd 是 SOCK_DGRAM 類型,則 addr 是默認(rèn)發(fā)送數(shù)據(jù)報的地址,也是接收數(shù)據(jù)報的唯一地址。

largeQ
TA貢獻(xiàn)2039條經(jīng)驗 獲得超8個贊
如果您不忽略從 WriteToUDP 返回的錯誤,它實際上會給您一個錯誤:“sendto: message to long”
在 OSX 上,最大 UDP 數(shù)據(jù)報大小默認(rèn)設(shè)置為 9216 字節(jié)。您嘗試發(fā)送 15000 個字節(jié)。
如果你只是想寫回你收到的東西,那么寫
recvBuff[:n]
,其中 n 是之前接收的字節(jié)數(shù)。
- 2 回答
- 0 關(guān)注
- 141 瀏覽
添加回答
舉報
0/150
提交
取消