1. Socket Handle和地址对
一个socket handle对应srcIP:srcPort&destIP:destPort
在同一个地址上建立多个连接,像下面的实例:
ip1:port1 --> ip5:port5
ip1:port1 --> ip6:port6
接着在这个地址上创建监听socket,
ip1:port1 --> *:* 对应所有的ip&port。
2. Herm的实现代码
在同一个地址上创建多个socket handles,关键在于SO_REUSEADDR这个Socket层级别的选项,通过setsocketopt将这个选项打开,就可以在同一个地址创建多种socket handles。
Herm的Socket 组件中的Connector&Acceptor支持在同一个地址上创建多个连接和多个监听。
先在ip1:port1上创建到ip5:port5的连接:
Herm::Connector conn; Herm::Stream s; Herm::Address localAddr(ip1, port1); Herm::Address remoteAddr(ip5, port5); conn.Connect(localAddr, remoteAddr, s, true);
上面s对象对应:ip1:port1-->ip5:port5.
继续在ip1:port1创建到ip6:port6的连接,代码和上面差不多:
Herm::Stream s2; Herm::Address remoteAddr(ip6, port6); conn.Connect(localAddr, remoteAddr, s, true);
两个连接创建完成。可以用s.Send(...)&s2.Send(...)向两个tcp server发送数据。
最后,我们还要在ip1:port1上启动监听,接受外部的连接.
Herm::Acceptor acceptor(localAddr, true); Herm::Stream s3; acceptor.Accept(s3); s3.Receive(buf, sizeof(buf));
得到一个连接后,接收一些数据。
甚至在同一个地址上可以启动多个监听,但感觉有点乱,实际中应该用不到。