我有一个Moxa device从串行数据创建Tcp-ip消息并通过LAN发送给我。 我需要用python服务器听他特定的external-ip(172.16.0.77)。 我试着这样做:
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()
我得到:[Errno 10049]请求的地址在其上下文中无效,无法打开套接字
我需要将服务划分为许多Moxa设备,因此我无法使用socket.INADDR_ANY
有什么想法吗?
答案 0 :(得分:1)
socket.INADDR_ANY
等于socket.bind('0.0.0.0')
如果绑定到" 0.0.0.0"可以听所有接口(可用)
Moxa 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服务器模式的moxa"
我在120设备上使用了4x5450i 3x5250而没有任何错误。