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不一样,所以不会冲突(大概,有待验证。)
展开
 我来答
gy93108083
2014-11-06 · TA获得超过283个赞
知道小有建树答主
回答量:665
采纳率:50%
帮助的人:273万
展开全部
每次调用的对象是重新构造的还是同一个,要么试试每次都重新构造对象来连接。
更多追问追答
追问
我想应该是同一个,不然NAT怎么记住同一个端口对应的外网端口。但问题是怎样才能用同一个而不是重新构造一个去counnect另一个IPEndPiont。。。。好纠结!!
追答
socket的操作应该是新开了线程去执行的,所以建议你每次连接重新构造一个新的吧。
Storm代理
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto... 点击进入详情页
本回答由Storm代理提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式