请教 socket 如果同时对多个端口进行监听并接受数据

社区昵称不能为空 2017-11-28 03:02:30
场景是这样的
我们先跟漆面检测仪对接,检测仪10台,设置好了socket服务器的IP和端口号。
例如:192.168.0.1:2203
192.168.0.1:2204
......
192.168.0.1:2210
然后服务器根据端口号来确定是哪个设备发送过来的数据.
问题是不能,我总不能复制10次代码,每次修改要改10次。又增加,又要复制一遍。
小弟不才,不知道有什么好的办法,可以一套代码维护。
...全文
2412 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿珊和她的猫 2020-04-01
  • 打赏
  • 举报
回复
如果?如何?
yuexinzhen 2019-07-25
  • 打赏
  • 举报
回复
这个不就是串口服务器吗?串口服务器就是一个IP,多个端口啊!请问这个问题有简单的处理方法了吗?
关中山水郎 2019-03-28
  • 打赏
  • 举报
回复
引用 8 楼 wanghui0380 的回复:
额,我们表示服务端只一个端口,客户端可以固定端口也可以随机端口 比如,我们假设QQ就一个服务器,有上千万客户端,你觉着QQ会在服务器上开上千万的端口监听么?? ps:请明白何谓“套接字”,sokect监听基于套接字,而不是基于端口
xuzuning 2017-11-28
  • 打赏
  • 举报
回复
既然你们都认可 sokect监听基于套接字 而 源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字 所以楼主以固定 目的IP地址以及目的端口号 方式进行设计(因为客户端ip是DHCP获取的)是没有问题的 如果只提供服务端ip和唯一的端口的话(类似http服务),至少有大部分人会因为无法区分信号来源而使项目流产
  • 打赏
  • 举报
回复
一台设备连个服务端就让服务端开个端口不疯了,觉得你大概是要的是这个Socket.RemoteEndPoint
wanghui0380 2017-11-28
  • 打赏
  • 举报
回复
引用
套接字 编辑 源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务。
所以呢,你看到了,就算服务端是1个端口,只要客户端ip不同(端口也可以不同)他们的套接字就不同,我们编写代码只是对套接字接收/发送信息(一个套接字对于我们来说就相当与是确定的线路)
weixin_37971462 2017-11-28
  • 打赏
  • 举报
回复
将所有 IP prot 装在 dictory 字典中 将建立的所以SOKET对象放在 List<Socket> cs = new List<Socket>();中 不知道是否对应你的监控多个IP的问题,希望对你有帮助 if (button3.Text == "开始监控") { button3.Text = "断开监控"; button1.Enabled = false; button2.Enabled = false; foreach (KeyValuePair<string, string> kv in dictory) { try { string ip = kv.Key; string ports = kv.Value; IPAddress ipAddress = IPAddress.Parse(ip); Info = new IPEndPoint(ipAddress, Convert.ToInt32(port)); socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); cs.Add(socket); socket.Connect(Info); socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), socket); } catch (Exception e1) { MessageBox.Show(e1.Message); } finally { } } } else { button3.Text = "开始监控"; button1.Enabled = true; button2.Enabled = true; cs.Clear(); socket.Close(); } 异步回调 private void ReceiveCallBack(IAsyncResult AR) { try { if (cs.Count != 0) { Socket socket = AR.AsyncState as Socket; int REnd = socket.EndReceive(AR); if (REnd > 0) { NetInvoke mi = new NetInvoke(UpdateView); this.BeginInvoke(mi); } if (socket != null) socket.BeginReceive(buffer, 0, buffer.Length, 0, new AsyncCallback(ReceiveCallBack), socket); } } catch (Exception e) { MessageBox.Show(e.Message); } }
wanghui0380 2017-11-28
  • 打赏
  • 举报
回复
额,我们表示服务端只一个端口,客户端可以固定端口也可以随机端口 比如,我们假设QQ就一个服务器,有上千万客户端,你觉着QQ会在服务器上开上千万的端口监听么?? ps:请明白何谓“套接字”,sokect监听基于套接字,而不是基于端口
xuzuning 2017-11-28
  • 打赏
  • 举报
回复
你当然是知道你有多少台设备的
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
TCP/IP 通讯本身就是一对一的 所以为什么不能复制10次代码? 如果你不想 每次修改要改10次,那你就写成一个类,对每台设备实例化一个对象
复制10次,维护麻烦。 如果实例化的话,首先要知道有多少台设备,我是想是否能实现我直接开启20个端口的监听。
  • 打赏
  • 举报
回复
引用 2 楼 cyg17173 的回复:
例如:192.168.0.1:2203 192.168.0.1:2204 ...... 192.168.0.1:2210 这个好神奇,没见过。
是设备指定的服务端的Ip+端口。服务器的ip是固定的。
  • 打赏
  • 举报
回复
引用 1 楼 diaodiaop 的回复:
不对.. 你既然是有10个设备.这10个设备的IP怎么可能都一样? 而且你说的是服务端.. 既然有服务端 就也有客户端啊. 服务端的端口是监听的.. 客户端呢 又是随机的. 所以不存在你所谓的"指明". 正常tcp/ip通讯 你是无法指明客户端的端口..你只能通过他们的IP来判断.. 当然了 如果是同一个IP 外接出来10个设备..你肯定无法区分..这个时候 就涉及到"协议"了..也就是 你在传输的命令中 来告诉这个设备是谁. 所以..你要问什么 ..我根本没懂...
是设备连接服务器的ip+端口。所以是10个设备,同样的ip不同的端口
xuzuning 2017-11-28
  • 打赏
  • 举报
回复
TCP/IP 通讯本身就是一对一的 所以为什么不能复制10次代码? 如果你不想 每次修改要改10次,那你就写成一个类,对每台设备实例化一个对象
cyg17173 2017-11-28
  • 打赏
  • 举报
回复
例如:192.168.0.1:2203 192.168.0.1:2204 ...... 192.168.0.1:2210 这个好神奇,没见过。
by_封爱 版主 2017-11-28
  • 打赏
  • 举报
回复
不对.. 你既然是有10个设备.这10个设备的IP怎么可能都一样? 而且你说的是服务端.. 既然有服务端 就也有客户端啊. 服务端的端口是监听的.. 客户端呢 又是随机的. 所以不存在你所谓的"指明". 正常tcp/ip通讯 你是无法指明客户端的端口..你只能通过他们的IP来判断.. 当然了 如果是同一个IP 外接出来10个设备..你肯定无法区分..这个时候 就涉及到"协议"了..也就是 你在传输的命令中 来告诉这个设备是谁. 所以..你要问什么 ..我根本没懂...

111,093

社区成员

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

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

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