udp广播收到重复包
测试环境中普通单网卡/多网卡不会存在问题,当在多网卡聚合的节点上虚拟机(虚拟机分配的是单网卡)测试的时候,就会收到重复包(两条,应该是因为只是两个网卡聚合)
1. 普通单网卡/多网卡:
[root@client apps]# ./m client b
Announce: 255.255.255.255:12345
[root@server tmp]# ./m server
Received request from 192.168.0.76:36974 i 0
hello sir
^C
[root@server58 tmp]# ifconfig
br0 Link encap:Ethernet HWaddr 00:30:48:FD:A3:11
inet addr:192.168.0.58 Bcast:192.168.255.255 Mask:255.255.0.0
inet6 addr: fe80::88de:c5ff:fe47:d65e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:123573262 errors:0 dropped:0 overruns:0 frame:0
TX packets:8604390 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:7772234332 (7.2 GiB) TX bytes:759119584 (723.9 MiB)
br1 Link encap:Ethernet HWaddr 00:30:48:FD:A3:10
inet addr:192.168.0.167 Bcast:192.168.255.255 Mask:255.255.0.0
inet6 addr: fe80::230:48ff:fefd:a310/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:746 (746.0 b)
2. 聚合的虚拟机测试:(具体聚合方式不清楚)
[root@client apps]# ./m client b
Announce: 255.255.255.255:12345
[root@cnode100 apps]# ./m server
Received request from 192.168.0.76:34983 i 0
hello sir
Received request from 192.168.0.76:34983 i 1
hello sir
3. 以下是测试程序:
package main
import (
"flag"
"fmt"
"net"
"time"
)
func main() {
flag.Parse()
if flag.Arg(0) == "client" {
b := false
if flag.Arg(1) == "b" {
b = true
}
Client(b)
} else if flag.Arg(0) == "server" {
Server()
}
}
func Server() {
udpaddr, err := net.ResolveUDPAddr("udp", "0.0.0.0:12345")
if err != nil {
fmt.Println(err)
return
}
listen, err := net.ListenUDP("udp", udpaddr)
if err != nil {
fmt.Println(err)
return
}
defer listen.Close()
i := 0
for {
data := make([]byte, 100)
n, rAddr, err := listen.ReadFromUDP(data)
if err != nil {
fmt.Println("Read: ", err)
continue
}
fmt.Println("Received request from ", rAddr.String(), " i ", i)
fmt.Println(string(data[:n]))
i++
}
}
func Client(b bool) {
a := "192.168.18.100"
if b {
a = "255.255.255.255"
}
addr := fmt.Sprintf("%s:%d", a, 12345)
fmt.Println("Announce: ", addr)
radd, err := net.ResolveUDPAddr("udp", addr)
if err != nil {
fmt.Println("Announce fail:", err)
return
}
udp, err := net.DialUDP("udp", nil, radd)
if err != nil {
fmt.Println("Announce fail:", err)
} else {
udp.SetDeadline(time.Now().Add(time.Second * 3))
_, err = udp.Write([]byte("hello sir"))
if err != nil {
fmt.Println("Announce fail:", err)
}
}
udp.Close()
}