Python - 发送紧急数据(tcp)
问题描述:
我通过TCP在python中发送紧急数据时遇到问题。Python - 发送紧急数据(tcp)
我已经研究了TCP报头和出带外数据传输机制的结构,但我仍然无法理解如何实现这个..
简单的服务器:
#default steps
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
conn,addr = s.accept()
...
#oob
conn.send('!',MSG_OOB)
...
简单的客户端:
...
data = conn.recv(BUFFER_SIZE,MSG_OOB)
OK,收到数据。
但我怎么能指出,当我发送周期数据时,OOB信息来到客户端?
例如:
serverFile = open(serverPath, 'rb')
while True:
fileBytes = serverFile.read(1000)
if not fileBytes: break;
try:
i += 1
if i % 1000 == 0:
print 'sending urgent..'
conn.send('!',MSG_OOB)
conn.send(fileBytes)
except socket.error, (value, message):
if conn:
conn.close()
serverFile.close()
print 'Error while sending data : error code - ' + str(value) + '; message: ' + message
exit(1)
serverFile.close()
如果客户试图用 '数据= conn.recv(BUFFER_SIZE,MSG_OOB)' 接收所有的数据 - 没有什么作品。 我还没有找到任何方式来使用SELECT或像SIGURG一样解决问题。
答
也许这将帮助别人(明显但不是特别有效的解决方案): 客户端:
#catching urgent data
s.settimeout(2)
try:
data = s.recv(BUFFER_SIZE,MSG_OOB)
except socket.error, value: #(value,message):
#s.settimeout(5)
data = None
if data:
print 'urgent ' + str(data)
else:
#recv usual data
data = s.recv(BUFFER_SIZE)
以防万一你不知道,TCP OOB数据被称为是不可靠的,破碎和不兼容的实现不同的操作系统。这就是为什么没有人使用它,反过来这就是为什么没有人关心修复它。 – rodrigo