LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

c# socket TCP P2P 要怎样才能让同一端口重新连接

admin
2017年4月12日 1:11 本文热度 6906
最近在做相关的东西,我是这样理解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 编辑过

全部评论1

admin
2017年4月12日 1:14
每次调用的对象是重新构造的还是同一个,要么试试每次都重新构造对象来连接。
追问
我想应该是同一个,不然NAT怎么记住同一个端口对应的外网端口。但问题是怎样才能用同一个而不是重新构造一个去counnect另一个IPEndPiont。。。。好纠结!!
追答
socket的操作应该是新开了线程去执行的,所以建议你每次连接重新构造一个新的吧。
追问
如果重连就得不到正确的端口号了。比如我连接服务器,服务器确认出连接的客户端A的外网地址为192.168.1.1:5432。我需要其它客户端对A的外网地址进行连接以达到P2P的效果。可是如果我新构造一个,新构造的外网映射地址就绝对不会是这个192.168.1.1:5432。那其它客户端怎么连啊。。。。。。。。。
追答
那我建议你使用 UdpClient 进行通信

该评论在 2017/4/12 1:14:49 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved