c# mono linux Socket RemoteEndPoint == 相等 一直 false

这几天又遇到一个挺怪的坑,记录一下

一句话概括:RemoteEndPoint的返回是new出来的,所以不相等,不理解的看相等运算符(C# 参考)

故事:一个socket服务端程序,在windows上运行正常,于是想放到linux服务器上看看效果,用的mono,结果运行到一半不正常了,于是开始排查(这个排查没法打断点什么的所以其麻烦无比,要在不同位置Console打出看然后判断),最后一步一步锁定到了这个效果

var a = task.Result.RemoteEndPoint;
var b = a;
var c = a;
var d = task.Result;
var e = task.Result;
Console.WriteLine(b == c);//ture //不是重载==
Console.WriteLine(d.RemoteEndPoint == e.RemoteEndPoint);//false 
Console.WriteLine(e.RemoteEndPoint == e.RemoteEndPoint);//false //确定问题再属性RemoteEndPoint上
Console.WriteLine(task.Result.RemoteEndPoint == task.Result.RemoteEndPoint);//false

这个时候猜测到是RemoteEndPoint每次的返回都不是同一个对象
追了一下找到了这几句(简化版的RemoteEndPoint {get}):

SocketAddress socketAddress = m_RightEndPoint.Serialize();
m_RemoteEndPoint = m_RightEndPoint.Create(socketAddress);
return m_RemoteEndPoint;

Create(IPEndPoint的)也看了,反正肯定是新new出来的(new的位置在System.Net.SocketAddress.GetIPEndPoint()里有一句return new IPEndPoint(iPAddress, port);),这样就解释了问题。

这个过程和错误足以体现本人有多菜了

不过还有个问题,为啥windows上直接运行没这问题。上面那一大排全是true,希望有大佬解答

解决方法

((IPEndPoint)socket.RemoteEndPoint).Equals(yourRemoteEndPoint)

或者

socket.RemoteEndPoint.ToString() == yourRemoteEndPoint.Tostring()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值