这几天又遇到一个挺怪的坑,记录一下
一句话概括: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()