1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-02-13 11:51:57 +00:00
srs/trunk/3rdparty/srs-bench/vnet/udpproxy_direct.go

45 lines
1.1 KiB
Go
Raw Normal View History

2021-03-09 14:26:50 +00:00
package vnet
import (
2021-05-03 02:01:53 +00:00
"fmt"
2021-03-09 14:26:50 +00:00
"net"
)
2021-05-03 02:01:53 +00:00
// Deliver directly send packet to vnet or real-server.
// For example, we can use this API to simulate the REPLAY ATTACK.
2021-03-09 14:26:50 +00:00
func (v *UDPProxy) Deliver(sourceAddr, destAddr net.Addr, b []byte) (nn int, err error) {
v.workers.Range(func(key, value interface{}) bool {
2021-05-03 02:01:53 +00:00
if nn, err = value.(*aUDPProxyWorker).Deliver(sourceAddr, destAddr, b); err != nil {
2021-03-09 14:26:50 +00:00
return false // Fail, abort.
} else if nn == len(b) {
return false // Done.
}
return true // Deliver by next worker.
})
return
}
func (v *aUDPProxyWorker) Deliver(sourceAddr, destAddr net.Addr, b []byte) (nn int, err error) {
addr, ok := sourceAddr.(*net.UDPAddr)
if !ok {
2021-05-03 02:01:53 +00:00
return 0, fmt.Errorf("invalid addr %v", sourceAddr) // nolint:goerr113
2021-03-09 14:26:50 +00:00
}
2021-05-03 02:01:53 +00:00
// nolint:godox // TODO: Support deliver packet from real server to vnet.
// If packet is from vnet, proxy to real server.
2021-03-09 14:26:50 +00:00
var realSocket *net.UDPConn
if value, ok := v.endpoints.Load(addr.String()); !ok {
return 0, nil
2021-05-03 02:01:53 +00:00
} else { // nolint:golint
2021-03-09 14:26:50 +00:00
realSocket = value.(*net.UDPConn)
}
// Send to real server.
if _, err := realSocket.Write(b); err != nil {
return 0, err
}
return len(b), nil
}