UDP代理,如何维护/重用/清除连接的客户端池?

我正在创建 UDP代理 go 中,但是在进行某些加载时 使用 iperf 进行测试,我开始收到此错误:</ p>

  socket  :打开的文件过多
</ code> </ pre>

在搜索和测试后,我发现如果我使用地图打开连接是键</ strong> * net.UDPAddr.String()</ code> value </ strong>的 UDP代理</ code> 包含一个 * net.UDPConn </ code> ,我可以重用现有的connectio 如果客户端地址相同,则为n:</ p>

  var客户端map [string] * UDPProxy.UDPProxy = make(map [string] * UDPProxy.UDPProxy)
</ 代码> </ pre>

这部分代码类似于:</ p>

  //等待连接
for {
n,clientAddr,err:= conn.ReadFromUDP(buffer)
,如果错误!= nil {
log.Println(err)
}
计数器++
如果* d {
log.Printf(“来自%s的新连接”,clientAddr。 String())
}
fmt.Printf(“连接:%d,客户端:%d
”,计数器,len(客户端))
代理,找到= clients [clientAddr.String()]
如果!found {
//建立到远程服务器的新连接
代理= UDPProxy.New(conn,clientAddr,raddr_udp,* d)
client [clientAddr.String()] =代理
}
进行代理 .Start(buffer [0:n])
}
</ code> </ pre>

这似乎可行,但是我现在遇到的问题是我需要鳍 过期的一种方式,当客户端存在或不再使用代理时清理地图,这样我就可以避免有多个未使用的连接。</ p>

任何想法我都可以如何改善或 更好的是,如何完全替换地图,我不知道渠道是否可以帮助您 完整?</ p>

谢谢。</ p>
</ div>

展开原文

原文

I am creating a UDP-proxy in go, but while doing some load test using iperf, I start to get this error:

socket: too many open files

After searching and testing, I found that if I create a pool using a map of opening connections being the key *net.UDPAddr.String() and the value an instance of UDP-proxy containing an *net.UDPConn, I am available to reuse existing connection in case the client address is the same:

var clients   map[string]*UDPProxy.UDPProxy = make(map[string]*UDPProxy.UDPProxy) 

This block of code looks something like:

// wait for connections
for {
    n, clientAddr, err := conn.ReadFromUDP(buffer)
    if err != nil {
        log.Println(err)
    }
    counter++
    if *d {
        log.Printf("new connection from %s", clientAddr.String())
    }
    fmt.Printf("Connections: %d, clients: %d
", counter, len(clients))
    proxy, found = clients[clientAddr.String()]
    if !found {
        // make new connection to remote server
        proxy = UDPProxy.New(conn, clientAddr, raddr_udp, *d)
        clients[clientAddr.String()] = proxy
    }
    go proxy.Start(buffer[0:n])
}

This seems to be working, but the problem I have now, is that I need find a way of expiring,cleaning the map when the client exists or is not using any more the proxy so that I could avoid having multiple unused connections.

Any idea how of could I improve this or even better, how could I replace totally the map, I don't know if channels could be help full?

Thanks in advance.

doucaishi0077
doucaishi0077 您不会“建立连接”,也根本不需要“打开新连接”。我重复一遍,您只需要一个UDP套接字即可完成所有操作。您的问题是基于严重的误解。
4 年多之前 回复
douxiajia6104
douxiajia6104 问题不是在一个UDP套接字中侦听,那很好,问题是每个建立的连接我得到了一个IP:PORT我​​需要代理的IP(与远程服务器的新连接),如果正确,iperf将数据发送到块使用相同的端口,因此,我不能只打开新的连接,而需要找到一种方法来处理现有客户端。
4 年多之前 回复
duanmengmiezen8855
duanmengmiezen8855 为什么?当您只需要一个UDP套接字时,怎么可能达到极限?
4 年多之前 回复
doulin6761
doulin6761 感谢您的观察,我的意思是使用代理的客户端池,这个问题与UDP协议的工作方式无关,而与如何维护将使用代理的客户端列表有关,以避免达到过多限制打开文件
4 年多之前 回复
dsvtnz6350
dsvtnz6350 由于UDP是无连接协议,因此您的问题毫无意义。
4 年多之前 回复

1个回答



由于您正在创建UDP代理,因此您可能知道必须要想出自己的解决方案来决定何时“终止” 代理会话。 会话只是涉及UDP的抽象-除非您使用的UDPProxy软件包已经建立了机制。</ p>

根据创建UDP代理的原因,这可能很容易 任意清理连接... </ p>

因此,如果您知道客户端正在退出,请在代理上调用Close()方法(假设有一个)并在映射项上使用delete 。</ p>

如何确定客户端要退出取决于您。 可以将切片用作FIFO,或随机选择一个,或尝试为每个切片设置计时器。</ p>
</ div>

展开原文

原文

Since you are creating UDP proxies, you probably know that you have to come up with your own solution for deciding when to "terminate" the proxy session. The session is just an abstraction when it comes to UDP - unless the UDPProxy package you're using has an established mechanism already.

Depending on why you are creating UDP proxies, it might be easy to arbitrarily cleanup connections ...

So if you know that a client is exiting, call the Close() method on the proxy (assuming there is one) and use delete on the map entry.

How to decide that a client is exiting is up to you. Could use a slice as a FIFO, or pick one randomly, or try setting timers for each.

dtyyrt4545
dtyyrt4545 是的,但是因为我要代理,所以我需要为每个调用创建一个新的UDPConn,因此我需要找到一种方法来正确处理客户端以重用/关闭会话,如您所述
4 年多之前 回复
douyi1966
douyi1966 哦是的 因此,该程序包使用net.DialUDP()来返回UDPConn指针。 在从程序内存中完全删除代理对象之前,UDPConn需要对其调用Close()。 然后,操作系统将能够关闭文件描述符。
4 年多之前 回复
doupingdiao3546
doupingdiao3546 OP链接到其自己的UDP代理代码,从而为每次对New的调用打开一个新套接字
4 年多之前 回复
dtuqxb3884
dtuqxb3884 我还应该问,您正在使用什么UDPProxy软件包?
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问