【发布时间】: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