C#论坛-玄机论坛-C#论坛-玄机宝盒-玄机类库-C#

 找回密码
 关闭注册

QQ登录

只需一步,快速开始

查看: 5165|回复: 2

[已解决] 问一下论坛里的Socket类库源码的一个小问题......

[复制链接]
ShineJun 发表于 2018-4-18 14:18:41 | 显示全部楼层 |阅读模式
2紫晶
TcpServer类中有一个向某一位客户端发送信息的 SendToClient(IPEndPoint ip, string SendData),如果我在变量ip直接传入一个IPEndPoint地址,这个地址也已经存在于ClientList中了。为什么会导致下面的Sockets sks执行返回NULL,而发不出消息呢?而如果传入一个像Demo这样的ComboBox集合就不会NULL了。这是为什么呢?
我是这么调用的,直接在论坛的Demo上添加了textBox1和textBox2,再修改一下。调试时,待客户端连接后,再输入ip和端口......
        //发送消息给指定客户端
        private void btnSendto_Click(object sender, EventArgs e)
        {
            if (cmbClient.SelectedItem != null)
            {
                IPEndPoint ipendpoint = new IPEndPoint(IPAddress.Parse(textBox1.Text.Trim()), int.Parse(textBox2.Text.Trim()));
                //server.SendToClient((IPEndPoint)cmbClient.SelectedItem, string.Format("服务端随机消息...{0}", Guid.NewGuid().ToString()));
                server.SendToClient(ipendpoint, string.Format("服务端随机消息...{0}", Guid.NewGuid().ToString()));
            }
        }


另外,下面一句
Sockets sks = ClientList.Find(o => { return o.Ip == ip; });
这个语句大约....猜测作用是在ClientList集合中查找IP吗?o是什么来的?能否解释一下这个语句是什么作用的?
初学C#不久,不懂问下轻拍哈~~




最佳答案

查看完整内容

[mw_shl_code=csharp,true] //问题1: IPEndPoint ipendpoint = new IPEndPoint(IPAddress.Parse(textBox1.Text.Trim()), int.Parse(textBox2.Text.Trim())); 你使用new就等于是创建了一个新的IPEndPoint,虽然ip与端口是与(IPEndPoint)cmbClient.SelectedItem一样的, 但是下面我用的比较方式是==,在不重写IPEndPoint的比较方式时,是没有办法相等的.所以你获取的sks是null.如果想让上面的方法成立,那么你只需要修改 Sockets sks ...
玄机论坛-专业的C#交流论坛 交流QQ群: 16885911
帖子内网盘失效后请使用下面地址

http://bbs.msdn5.com/forum.php?mod=viewthread&tid=1218
如果失效请联系站长重新分享
回复

使用道具 举报

君临 发表于 2018-4-18 14:18:42 | 显示全部楼层
[mw_shl_code=csharp,true]
//问题1:
IPEndPoint ipendpoint = new IPEndPoint(IPAddress.Parse(textBox1.Text.Trim()), int.Parse(textBox2.Text.Trim()));

你使用new就等于是创建了一个新的IPEndPoint,虽然ip与端口是与(IPEndPoint)cmbClient.SelectedItem一样的,
但是下面我用的比较方式是==,在不重写IPEndPoint的比较方式时,是没有办法相等的.所以你获取的sks是null.如果想让上面的方法成立,那么你只需要修改

Sockets sks = ClientList.Find(o => { return o.Ip.ToString()==ip.ToString(); }); 这样就可以获取到了.


//问题2:
Sockets sks = ClientList.Find(o => { return o.Ip == ip; });
这句的意思是在ClientList集合中寻找Ip==ip的对象.  作用等同以下代码

Sockets sks = null;
foreach(var o in ClientList){
  if(o.Ip == ip){ //find中的o表示每次寻找的元素,也就是这个foreach中的o.
     sks=o ;break;
   }
}
[/mw_shl_code]





玄机论坛-专业的C#交流论坛 交流QQ群: 16885911
帖子内网盘失效后请使用下面地址

http://bbs.msdn5.com/forum.php?mod=viewthread&tid=1218
如果失效请联系站长重新分享
回复

使用道具 举报

 楼主| ShineJun 发表于 2018-4-19 08:48:25 | 显示全部楼层
君临 发表于 2018-4-19 01:04
[mw_shl_code=csharp,true]
//问题1:
IPEndPoint ipendpoint = new IPEndPoint(IPAddress.Parse(textBox1. ...

很感谢大大详细回复,特此谢谢一个
玄机论坛-专业的C#交流论坛 交流QQ群: 16885911
帖子内网盘失效后请使用下面地址

http://bbs.msdn5.com/forum.php?mod=viewthread&tid=1218
如果失效请联系站长重新分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 关闭注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

QQ|玄机论坛

GMT+8, 2024-3-29 23:38 , Processed in 0.158084 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表