我在python上使用asyncore.dispatcher客户端连接到在PC上运行的LabWindows中开发的服务器。这是客户端上连接到服务器的代码片段:
class DETClient(asyncore.dispatcher):
def __init__(self, host, port):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect((host,port))
在服务器端,我的Labwindows代码正在寻找两个参数,TCPPeerName和TCPPeerAddr:
GetTCPPeerName (handle, peerName, sizeof (peerName));
GetTCPPeerAddr (handle, peerAddress, sizeof (peerAddress));
似乎python代码根本没有传递主机名,因为我的服务器为PeerName获取了一个NULL。
我是否必须做任何事情才能使asyncore客户端在建立连接时发送PeerName?
答案 0 :(得分:1)
我是否必须做任何事情才能使asyncore客户端在建立连接时发送PeerName?
不,您没有,因为TCP客户端在建立连接时不发送名称。他们发送地址。
GetTCPPeerName
几乎肯定会调用gethostbyaddr(X)
,其中X
是GetTCPPeerAddr
返回的地址。在您的情况下gethostbyaddr()
失败,因为信息不可用。
这意味着您的主机名解析数据库缺少某些数据 - 您可能需要更新DNS,主机文件,WINS数据或主机名数据所在的位置。
答案 1 :(得分:0)
那是DETClient的实际实现吗?因为它缺少该实例的主机和端口的实例化? 在self.connect中你使用的是self.host和self.port,因为你还没有设置它们,所以它们都会被调整为无。
class DETClient(asyncore.dispatcher):
def __init__(self, host, port):
self.host = host #<---- this is missing
self.port = port #<---- this is missing
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect((self.host,self.port))