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()
}

posted on 2019-07-18 09:55  泛泛后生  阅读(1048)  评论(0编辑  收藏  举报