2015-09-09 1 views
0

Я написал следующий простой udp-сервер/клиент в golang. Приложение отправляет текущее время в указанную локальную адресную строку ipv6. Приемник отправляет обратно небольшой ответ. Это работает ТОЛЬКО, если порт отправителя ответа совпадает с портом назначения запроса.Golang: поведение ReadFromUDP, когда порт источника отличается от ответа на вызов

Wireshark Сравнение: https://www.dropbox.com/s/ypaepz62sa4xtnh/go_simple_udp3.png?dl=0

Почему это так?

package main 

import (
"net" 
"log" 
"fmt" 
"time" 
) 

func main() { 

//Remote Addr 
BoxAddr, err := net.ResolveUDPAddr("udp6", "[fe80:0000:0000:0000:0211:7d00:0030:8e3f]:5684") 
if(err != nil) { 
    log.Fatal(err) 
    return 
} 

/* 
LocalAddr, err := net.ResolveUDPAddr("udp6", "[fe80::299f:4146:2e32:72fd%4]:50361") 
if(err != nil) { 
    log.Fatal(err) 
    return 
} 
*/ 
c, err := net.DialUDP("udp6", nil, BoxAddr) 
if(err != nil) { 
    log.Fatal(err) 
    return 
} 

defer c.Close() 

fmt.Print(c.LocalAddr()) 

//read loop 
go func(c *net.UDPConn) { 

    for { 
     rxMsg := make([]byte, 100); 
     n,_, err := c.ReadFromUDP(rxMsg) 
     if(err != nil) { 
      log.Fatal(err) 
      return 
     } else { 
      fmt.Print("Got from remote: ",n, " bytes\r\n") 
     } 
    } 
}(c) 

//write every second current time 
for { 
    b := []byte(time.Now().String()) 
    n, err := c.Write(b) 

    if(err != nil) { 
     log.Fatal(err) 
     return 
    } else { 
     fmt.Print("Wrote to destination socket: ",n, " bytes\r\n") 
    } 

    time.Sleep(1000 * time.Millisecond) 
} 
} 

ответ

0

При использовании DialUDP, вы создаете «Connected» UDP сокет, который прослушивает только для дейтаграмм из данного удаленного адреса. Лежащий в основе системного вызова такой же, как connect, в котором говорится на странице человека:

Если сокет sockfd имеет тип SOCK_DGRAM, то адрес является адресом, к которому датаграммы посылаются по умолчанию, и единственный адрес, с которого датаграммы .

Если вы хотите слушать любые дейтаграммы, полученные на определенный порт UDP, создать соединение с ListenUDP.

+0

Okey, я изменил код на: http://play.golang.org/p/FkxyS7asTA, но результат остается тем же: я могу получить только, если исходный порт ответа соответствует целевому порту запроса , Я не вижу смысла, почему исходный порт ответа имеет значение !? – wildcard

0

okey, я понял. сначала я должен извиниться за то, что не говорю, что я использую окна (10)! Это поведение происходит из брандмауэра Windows. Когда он выключен, я могу получать пакеты с разными портами SOURCE в ответе.