c# socket TCP P2P 要怎样才能让同一端口重新连接
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
最近在做相关的东西,我是这样理解P2P的:A和B都向S通信,如果A要连接B,需要先创建一个SOCKET SA连接S的一个端口SS,S通过SS与SA的连接得到SA端口的外网地址AS,然后把这个外网地址AS传给B,B也一样通过S将SB的外网地址BS传给A。A断开与S的连接的SA,B也一样断开SB,然后A用SA去连接SB的外网地址BS,之后转为listen模式等待B用SB连接AS。(可能有点乱。) 现在的问题是,如果我将这个新的SOCKET SA断开后(使用 client_mid.Shutdown(SocketShutdown.Both); client_mid.Disconnect(false);//改为TRUE 则需要用beginCounnect,但我想用Counnect,且延时过长 client_mid.Close(); ) 怎样才能再用这个Socket SA Counect B的外网地址BS?提示释放对象无法调用,改TRUE提示用异步调用且不能为同一IPENDPIONT? 因为要做到NAT穿网,如果我重新定义这个端口(比如CLOSE()后),对应的NAT的外网地址会不会改变了(原来SA对应着外网地址为AS,执行关闭后重新套接字后会不会SA就没有对应AS了?)?这样就连接不上了啊! 而且至今找不到方法来重新用这个socket SA来连接B的socket SB的外网地址BS!! 已解决,很简单,c#提供了这样一个功能SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);//端口复用!一个端口用两个套接字,然后其中一个套接字和服务器连接,另一个则可以和另一个客户端连接。因为都是同一端口,所以NAT映射的端口肯定一样。然后由于套接字的counnect目标IPEndPIONT不一样,所以不会冲突(大概,有待验证。) 该文章在 2017/4/12 1:13:26 编辑过
|
关键字查询
相关文章
正在查询... |