Python套接字不发送主机名

时间:2013-09-13 15:25:45

标签: python sockets asyncore

我在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?

2 个答案:

答案 0 :(得分:1)

  
    

我是否必须做任何事情才能使asyncore客户端在建立连接时发送PeerName?

  

不,您没有,因为TCP客户端在建立连接时不发送名称。他们发送地址。

GetTCPPeerName几乎肯定会调用gethostbyaddr(X),其中XGetTCPPeerAddr返回的地址。在您的情况下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))