C#如何实现基于动态ip的网络通信

weixin_37783744 2017-09-16 02:49:40
有大佬给指点下吗,我前面学习了SOKET,但是好像Socket不能实现
...全文
751 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
by_封爱 版主 2017-09-18
  • 打赏
  • 举报
回复
开发东西难道没有服务端吗
mixuyulvjie 2017-09-18
  • 打赏
  • 举报
回复
不错的文章!
weixin_37783744 2017-09-17
  • 打赏
  • 举报
回复
引用 2楼johnliuyuan 的回复:
你是说IP会不停的改变吗?这样的话你要自己定一个协议,用于广播自己的位置和身份,这样才能在IP改变的时候重新获取你的程序的位置。或者改变IP之前先通知通信的对方,自己要改IP了,怎么怎么着。或者,设置一个伪随机码,根据伪随机码更改自己的IP,对方也要知道这个伪随机码和你的IP 的对应关系,根据时间和码的转变改变对应的接收IP地址。最好是基于UDP协议,这样是无连接的,简单方便。
我的目的是,现在有两台或更多的PC,它们都是通过路由器(同一个路由器)连接了互联网,PC端的ipv4设置自动获取ip,我想在这两台PC间编程实现通信。但是我想到的问题是,其中一pc向其他的Pc发送数据,不是得先知道对方的Ip和端口么,前面也说了,所有的Ip是自动分配的,这样就不知道对方的Ip,也就不能实现通信了,不知道我的理解对不对。还有就是 UDP可以实现我说的这种目的么
  • 打赏
  • 举报
回复
我把这个问题的多个层面的问题说明出来。的在实际的系统设计中,有不同层次的技术点。有的人只关系最底层的东西,越是遇到高层一些的设计只是越是嗤之以鼻。然而你会发现,真正工作中,其实总是希望首先精通比较高层、高效率的操作方法,例如首先要求你给自己的企业的 IT 部门采购和调试一个 dns 服务器,而不是让你自己花5年时间去开发什么底层软件。所以先会实用应用开发层技术,那些抠底层的东西(对大4学生来说)通常要等到5~10年以后才真正需要你来研发使用。
  • 打赏
  • 举报
回复
给你举个实际业务的例子,比如某公司自己有个网站,它有许多个服务系统、并且之间需要 SOA 互相调用,那么它们就可以把服务地址统一地发布到自己公司的一个公共的网络服务器上。例如(这里只是举例)一个 http://www.abc.com/getIp.ashx?service=30112 返回其真实的服务器位置(甚至是动态地找一个对客户端响应最快的服务器),或者可以通过自己购买的(一年才50块钱)域名来解析各种不同的二级域名的 ip 或者跳转到其它域名。 我举这个例子,是说的是,这是一种实际的软件工程。不抠底层编程技术,来说说大量的流行的真正实用的系统的应用设计方法,那么思路就不一样了。
  • 打赏
  • 举报
回复
这一类,属于原始技术知识(网络 arp、dns协议等等层面的),就好像你学c语言觉得特别简单一样,其实只是解决原始知识问题。那么这类知识通常可以作为在家里“玩儿一玩儿”的对象,真正要快速解决应用问题,还是应该使用成熟的流行的大型框架,而不是只有千分之一内容的接近底层的技术。其实往往是,越是基本的东西越需要至少3~5年的打磨,你才能做出一个真正稳定的产品。
xuzuning 2017-09-17
  • 打赏
  • 举报
回复
引用
但是我想到的问题是,其中一pc向其他的Pc发送数据,不是得先知道对方的Ip和端口么
是的,端口是自行约定,ip是一定要知道的 但是,网段的最后一个地址是 UDP 广播地址,所以 UDP 通讯并不需要知道对方(们)的具体 IP 你在广播的数据中加入自己的 ip,这样就可以在接收方得到你的 ip 之后,转而通过 TCP/IP 进行点对点通讯
  • 打赏
  • 举报
回复
udp 进行广播、组播很容易,基本上什么也不用写,只是把组播地址写对就行。 但是如果过分强调这一点就等于坑爹地引导。因为组播/广播必须如珍惜眼珠子一样地少用,它仅仅用于登录时进行一次广播,其它时间就应该靠着强大的网络 p2p 协议来实现找到其它服务器的任务。 所以要知道,这类很容易抄袭(当作味精一样)的东西要想真正用好,这其实往往不是降低了学习门槛,而是提高了门槛。因此一般人并不适合开发这种东西,因为它很容易被滥用,从而因为一粒老鼠屎而坏了一锅汤。 所以这种东西了解了就可以了,通常你就按照常规的方式要求大家都知道一个服务器域名或者服务器地址,然后这个服务器放在任何地方(哪怕是在几千里地、许多层NAT路由器之外)也能通过双向长连接tcp通讯稳定地给各个客户端之间中转消息。就好像电话中继线一样足以支撑起来通讯网络,并不需要什么“动态电话”。
  • 打赏
  • 举报
回复
引用 3 楼 weixin_37783744 的回复:
还有就是 UDP可以实现我说的这种目的么
udp 或者 tcp 本身并不会实现你说的东西。 但是通常可以使用组播、广播方式,在小局域网中给其它机器发消息。不过要注意这必须限制到很小的范围,例如只是某个进程启动时广播一次消息(例如信息内容是:{myip:"123.123.123.1", mytype:"卖火柴的", myid:"kki2kas9df9q32kkas", mylogname:"张三"}),让其它进程知道此服务上线了。 在一个局域网里边,可能有20台机器相互通讯,那么每一台的程序进程启动时可能都会广播一下,这样当20台机器都上线后,对于最先上线的机器,就知道另外19台服务器的ip,对于第二上线的进程,就知道另外18台服务器.......但是一个系统随后作为客户端与它所知道的其它服务器经常通讯,就可以把自己所知道的其它服务器的信息跟对方交换,这样很快,这20个进程就知道所有其它服务器的 ip 了。 不过,这种点对点的通讯方式其实也比较复杂(你必须有能力设计协议,而不是只关心入门概念),滥用它也会造成广播风暴,而且路由器机制通常禁止这种东西,所以这种 P2P 的通讯协议不是主流。
  • 打赏
  • 举报
回复
动态 ip 地址是 dns 机制解决的问题,不是什么 c# 问题。 在你的网络中,必须有一个所有客户端都能明确访问到(而不是“不知道如何标识”)的服务器。至于是不是静态 ip 那不重要。多了解一些网络知识就会找到更多地标识、找到服务器的办法。
geforceliu 2017-09-17
  • 打赏
  • 举报
回复
一般在开发这类程序的时候,我会先设计一个服务器。通过服务器来分配其他PC之间的通讯问题。 根据你的情况,我觉得解决方案有2种。 1、前提你的PC都可以上网,在互联网上做一个服务器,来解决通讯问题。 2、a。PC开启软件的时候创建255个线程。 b。每个线程进行通讯测试连接从IP为1开始,PING到255。 c。如果PING有响应,则记录IP地址。否则设置超时时间,没响应的话结束线程。 d。将有响应的IP进行记录,并分配名称。 e。(比较关键)当程序退出的时候,需要发送给有响应的PC一个协议,将自己的IP从他们通讯录上删除。 f。需要注意,建议每个1分钟进行互相通讯一次。以防掉线,断电等其他问题发生。
john_QQ:2335298917 2017-09-16
  • 打赏
  • 举报
回复
你是说IP会不停的改变吗?这样的话你要自己定一个协议,用于广播自己的位置和身份,这样才能在IP改变的时候重新获取你的程序的位置。或者改变IP之前先通知通信的对方,自己要改IP了,怎么怎么着。或者,设置一个伪随机码,根据伪随机码更改自己的IP,对方也要知道这个伪随机码和你的IP 的对应关系,根据时间和码的转变改变对应的接收IP地址。最好是基于UDP协议,这样是无连接的,简单方便。
xuzuning 2017-09-16
  • 打赏
  • 举报
回复
UDP 就不需要静态ip

110,546

社区成员

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

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

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