2015-08-31 24 views
0

我有一個Moxa device,從串行數據創建Tcp-ip消息併發送它們通過局域網給我。 我需要用python服務器來監聽hes特定的external-ip(172.16.0.77)。 生病嘗試做到這一點:試圖綁定到特定的外部IP :: [Errno 10049]請求的地址是無效的在其上下文無法打開套接字 - (python 2.7)

BUFFER_SIZE = 10000 # Normally 1024, but we want fast response 
    HOST = self.TCP_IP #(172.16.0.77) 
    PORT = self.TCP_PORT    # Arbitrary non-privileged port 
    s = None 
    for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, 
            socket.SOCK_STREAM, 0, socket.AI_PASSIVE): 
     af, socktype, proto, canonname, sa = res 
     try: 
      s = socket.socket(af, socktype, proto) 
     except socket.error as msg: 
      print msg 
      s = None 
      continue 
     try: 
      s.bind(sa) 
      s.listen(1) 
     except socket.error as msg: 
      print msg 
      s.close() 
      s = None 
      continue 
     break 
    if s is None: 
     print 'could not open socket' 
    while s: 
     print s.getsockname() 
     conn, addr = s.accept() 
     print 'Connection address:', addr 
     data = conn.recv(BUFFER_SIZE) 
     if data: 
      self.emit(QtCore.SIGNAL("SamplesRecive"),data) 
     conn.close() 

,我也得到:[錯誤10049]請求的地址不在其上下文中有效無法打開套接字 我需要,所以我不能使用的發球分,以多Moxa的設備socket.INADDR_ANY

任何想法?

+0

在哪一行上會出現此錯誤? –

+0

[tag:pss] on [s.bind(sa)],謝謝 –

+0

下面'dsgdfg'提供的答案應該可以解決這個問題。這裏的其他帖子可能會幫助你找到原因。 http://stackoverflow.com/a/4657548/2382792 –

回答

1

socket.INADDR_ANY等於socket.bind('0.0.0.0')

如果結合 「0.0.0.0」 可以聽的所有接口(其中avaible)艾TCP的

例子:

import socket,time 
import thread 

#Example client 
class _client : 
    def __init__(self): 
     self.status = False 
    def run(self,clientsock,addr): 
     while 1 : 
      try: 
       data = clientsock.recv(BUFF) 
       if data : 
        #do something with data 
        time.sleep(.1) 
        if self.status == False: 
         clientsock.close() 
         break 
        clientsock.send(next_query) 


      except Exception,e : 
       print e 
       break 
client = _client() 
ADDR = ("0.0.0.0", 45500) #so you need port how to decode raw socket data ? 
serversock = socket(AF_INET, SOCK_STREAM) 
serversock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 
serversock.setsockopt(IPPROTO_TCP, TCP_NODELAY, 1)#gain 50ms tcp delay 
serversock.bind(ADDR) 
serversock.listen(10) 

While True : 
    clientsock, addr = serversock.accept() 
    if addr[0] == device_1_IP: 
     client.status = True 
     #start device1 thread(moxa is TCP client mode) 
     thread.start_new_thread(client.run, (clientsock, addr)) 
     #if client.status = False you will be close connection. 

但我的報價是「使用艾條與TCP服務器模式「

我用4x5450i 3x5250超過120設備沒有任何錯誤。

+0

[標籤:dsgdfg]所以我襪子連接客戶端,並保持連接,並等待接收?{while 1:received = sock.recv(10000)} –

+0

@ yotamazriel更新了示例客戶端的答案 – dsgdfg

+0

[tag:dsgdfg]所以,你創建服務器,然後你連接邊緣與試圖從moxa tcp消息接收的客戶端(你不使用在_client :: run中傳遞的addr參數)? 。 謝謝 ! –

相關問題