【问题标题】:Can not connect thrift c# client to python server无法将thrift c#客户端连接到python服务器
【发布时间】:2019-12-14 23:52:15
【问题描述】:

我有 Thrift 客户端-服务器应用程序 C# 客户端和 Python 服务器。都在同一台机器-Windows7。调试 Thrift 代码我看到客户端的套接字无法连接到服务器的本地服务器。
顺便说一句,同一个 C# 客户端连接到 C+ 服务器,而 python 和 c++ 客户端连接到同一个 python 服务器。只是 C#-->Python 组合失败。

问题看起来类似于Connecting Python SocketServer with C# Client。我尝试按照上面链接中的答案修改代码,但 C# 套接字仍然抛出“无法建立连接,因为目标机器主动拒绝了它 127.0.0.1:9091”


客户端(C#):

   IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
   IPAddress ipAddress = ipHostInfo.AddressList[1];
   IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);
   Socket client = new Socket(ipAddress.AddressFamily,SocketType.Stream, 
   ProtocolType.Tcp);
   TcpClient tcpClient = new TcpClient(AddressFamily.InterNetwork);
   tcpClient.Client = client;
   tcpClient.Connect(ip, port);

为什么是ipHostInfo.AddressList[1]?此选择将 IPv4 适配器从 ipconfig。我也尝试其他索引。

服务器(Python,内部 到 Thrift-sever 库):

res0 = socket.getaddrinfo(self.host,
                                          self.port,
                                          self._socket_family,
                                          socket.SOCK_STREAM,
                                          0,
                                          socket.AI_PASSIVE | 
    socket.AI_ADDRCONFIG)
    ...
    self.handle = socket.socket(res[0], res[1])
    self.handle.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    if hasattr(self.handle, 'settimeout'):
     self.handle.settimeout(None)
    self.handle.bind(res[4])
    self.handle.listen(self._backlog)
    client, addr = self.handle.accept()


对于 C# 客户端,它永远不会从 accept 退出

【问题讨论】:

  • 你为什么使用 AddressList[1] 而不是零?当您在同一台机器上时,请始终确保您的服务器正在侦听 IP.Any 并且客户端连接到机器名称(或 IP)。被拒绝的 127.0.0.1(环回地址)可能由于多种不同的原因而发生。通常,当客户端连接未完成时,您会得到它。机器有一个可以配置的主机文件(在 c:\windows 文件夹中)不同,因此代码将在其他主机文件上的某些机器上运行的位置不同并且可能会失败。当客户端尝试连接到环回时,Net 库会给出拒绝错误
  • @jdweng 我尝试了相同的结果。 AddressList[0] 返回 IPv6 地址

标签: c# python c++ sockets thrift


【解决方案1】:

你有太多重复的代码。尝试以下:

            //client
            IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
            IPAddress ipAddress = ipHostInfo.AddressList[1];
            IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);
            TcpClient tcpClient = new TcpClient();
            tcpClient.Connect(remoteEP);

            //Server
            IPEndPoint localEP = new IPEndPoint(IPAddress.Any, port);
            TcpListener listener = new TcpListener(localEP);
            listener.Start();

【讨论】:

  • 结论,在 C# thrift 客户端的情况下,套接字应该只在 Thrift 客户端之外初始化。值得庆幸的是,Thrift 客户端界面实现了这一点。
  • 相同的客户端代码停止工作。同样,只是客户端 C# --> 服务器 Python 不起作用。看起来初始化过程中缺少某些东西。有什么方法可以诊断吗?
  • 您可以使用像wireshark 或fiddler 这样的嗅探器来捕获TCP 消息。 Pythone 如果您遇到异常,您可以添加断点并查看 python 对象。我在 python 对象中找到了有用的信息来帮助调试问题。例如,我发现我的文件路径长度非常大,当我将代码从网络驱动器移动到 c:\ 时,代码工作正常。您还可以将调试 (net4log) 消息添加到 python 日志文件中,以帮助确定问题或查看现有日志文件。
  • 只需在工作案例 (C## --> C++) 上使用过滤器“loop and tcp.port == 9091”运行 Wireshark。我希望看到捕获它的工作原理。没什么...我错过了什么吗?
  • 我说客户端和服务器不能使用相同的IP。最好使用 IPEndPoint localEP = new IPEndPoint(IPAddress.Any, port) 作为服务器。将在任何条件下工作。环回有时由客户端使用,而 IP.Any 在 Windows 机器上为服务器保留。 Loopback 的设计目的是让您可以测试来自远程机器的连接(使用 ping)。
猜你喜欢
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多