C# 两台电脑如何通过外网通信

炒饭君 2013-07-27 10:46:14
因为初学C#,学到网络通信这就混乱了,还请大神赐教!
就是举个例子:比如,我的电脑 外网IP 是 116.246.2.227 ,我的 内网 IP 是 192.168.1.6 ,端口是:3200我想发送消息给 外网IP 是 220.120.123.42 内网 IP 是 192.168.0.2 端口为 3100 的电脑 ,如何顺利通信,这个通信的流程是怎样的,用C# 语言又该怎么变成实现?
可能我的例子有不恰当的地方,但是真心求赐教?
...全文
1049 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
炒饭君 2015-11-09
  • 打赏
  • 举报
回复
引用 14 楼 a1061747415 的回复:
各位大神,我把两台电脑,其中一台通过路由器映射了,也就成为了所为的服务器了,另一台也就是处在内网的,也就是我们平时一般人的电脑,也就是客户端了,那么客户端是可以向服务器发送消息,而且我通过编程发现,客户发来的消息的IP就是它外网的IP,但是端口每次都在改变,我服务器回发给那个IP和端口,结果客户端没收到消息,怎么回事? 我服务器该如何回复消息,如何准确的发给这个处在外网的机器,还请详细点。。。
时隔多年,其实问题到这边我已经解决了,再看这个问题,好多楼上的人自以为功力深厚就乱回答,并没有帮到当时的我,当时我就仔细看了,发现我原本的理解就是对的,只不过写错了一个函数,总结思路,分为两个关键: 1. 内网的机器发送给外网的机器,直接发送到相应的地址和端口上(外网的机器也就是可以称作服务器,有外网的IP地址以及固定的端口) 2. 外网的机器如何回复消息给内网的机器?因为处于内网的机器一旦通过路由器发送后,路由器这时候就临时开辟了一个端口,这时候外网的机器能够根据收到的消息捕获到它的端口以及IP地址,直接回复给这个端口和IP地址就行了,实际上也就是发送给了路由器。路由器收到外网的机器的消息后会转发给这个内网的机器的,因为路由器知道这个端口来的消息是哪个内网的机器。
www_WinUI_cn 2015-07-03
  • 打赏
  • 举报
回复
兄弟,解决了没?我也在弄这个问题,一直没有弄好!我的QQ号码是2257503452
Michaellovekobe 2015-05-04
  • 打赏
  • 举报
回复
嗨,说那么多,又是打洞什么的。LZ已经说了做了端口映射了。 但就没人说到点上,其实有些问题,不用说,给一段实例代码,哪怕是不成熟的几句代码 都比说那么多更形象
chenyun126 2014-05-04
  • 打赏
  • 举报
回复
请问问题解决了没? 求源代码。谢谢! chenyuncpp@126.com
qyqiaoyi 2014-03-04
  • 打赏
  • 举报
回复
还望楼主求解?
foxd 2013-08-05
  • 打赏
  • 举报
回复
Socket
炒饭君 2013-08-05
  • 打赏
  • 举报
回复
各位大神,我把两台电脑,其中一台通过路由器映射了,也就成为了所为的服务器了,另一台也就是处在内网的,也就是我们平时一般人的电脑,也就是客户端了,那么客户端是可以向服务器发送消息,而且我通过编程发现,客户发来的消息的IP就是它外网的IP,但是端口每次都在改变,我服务器回发给那个IP和端口,结果客户端没收到消息,怎么回事? 我服务器该如何回复消息,如何准确的发给这个处在外网的机器,还请详细点。。。
threenewbee 2013-08-03
  • 打赏
  • 举报
回复
光有IP和端口还是不行的,你需要一种传输层的协议。通常来说有TCP和UDP两种协议。对于TCP协议,需要三次握手的过程,你结合教材自己先了解下。再在网上找例子程序看。
threenewbee 2013-08-03
  • 打赏
  • 举报
回复
NAT打洞,适用于两端都是在内网的情况。因为第一次发送通讯请求,目标必须在公网上,所以通常来说,两端都在内网谁也无法发起连接,更不要说通讯了。 NAT打洞就是依赖一台服务器作为中转,让一个客户端和这个服务器通讯,另一个客户端通过实现和这个服务器建立的连接获得前一个客户端的端口、IP,然后服务器把控制权交给客户端,使得两个内网的客户端不再需要服务器中转就能直接通讯。
请叫我卷福 2013-08-03
  • 打赏
  • 举报
回复
如果只是自己测试 建议使用第二种 第一种没有成熟的设计的话 根本不稳定 很容易失效
请叫我卷福 2013-08-03
  • 打赏
  • 举报
回复
两个都在内网的主机需要通讯: 1.先打洞 2.如果做测试,可以在接收方的nat中做一个映射 比如把接收方所在内网路由器上的一个公网端口 映射到 内网中的接收主机 接收方公网IP 222.30.64.111 端口55555 设置映射 内网IP 192.168.1.100 内网端口 55556 那么你所有发送给 222.30.64.111:55555 的数据包 全部会转给 内网中 192.168.1.100:55556 至于发送方 不需要做处理 这个跟实际网络结构有关 不一定每次设置都会有效的
by_封爱 版主 2013-08-03
  • 打赏
  • 举报
回复
随便去下载类似聊天软件的例子自己研究就行了
炒饭君 2013-08-03
  • 打赏
  • 举报
回复
各位大神,还不够详细啊。。。
炒饭君 2013-07-27
  • 打赏
  • 举报
回复
引用 1 楼 guwei4037 的回复:
Socket、wcf、webservice都可以。
我想弄客户端的,可以详细点吗?
全栈极简 2013-07-27
  • 打赏
  • 举报
回复
Socket、wcf、webservice都可以。
weizhuangwen 2013-07-27
  • 打赏
  • 举报
回复
要在路由做端口映射
  • 打赏
  • 举报
回复
你需要使用Socket打开一个链接的通道进行传输
trust_love 2013-07-27
  • 打赏
  • 举报
回复
给楼主几个链接,看了 就很清晰明了了 http://www.cnblogs.com/JimmyZhang/archive/2008/09/07/1286300.html
  • 打赏
  • 举报
回复
如果是刚开始设计通讯方面程序,那么你使用服务器转发这一种形式也就够了。假设客户端跟服务器是长连接双工通讯的,那么你的通讯信令就应该可以区分是客户端到服务器还是从服务器到客户端的消息(例如使用id号>0和<0作为区分),服务器可以随时向客户端发送消息。当一个客户端发送消息给服务器,服务器判断这只是一个“路由消息”,于是它找到对方所在的Client通道,然后发送出去就行了,服务器处理这种动作不需要耗费基本毫秒的时间,也很快。
  • 打赏
  • 举报
回复
简单来说,你的两个电脑需要访问一台位于外网的服务器进行登录。它们登录时同时提交自己的内网地址。 然后内网的机器可以相互间首先使用对方的内网IP进行访问,使用服务器分配的授权号进行相互核对。如果可以对上授权号,那么就可以直接通讯;如果对不上,那么通过外网服务器转一下消息进行通讯。

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧