c# socket TCP P2P 要怎样才能让同一端口重新连接 20
最近在做相关的东西,我是这样理解P2P的:A和B都向S通信,如果A要连接B,需要先创建一个SOCKETSA连接S的一个端口SS,S通过SS与SA的连接得到SA端口的外网地...
最近在做相关的东西,我是这样理解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不一样,所以不会冲突(大概,有待验证。) 展开
现在的问题是,如果我将这个新的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不一样,所以不会冲突(大概,有待验证。) 展开
1个回答
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto...
点击进入详情页
本回答由Storm代理提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询