Python - 发送紧急数据(TCP)
我在用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)
好的,数据收到了。
但是,当我在循环中发送数据时,怎么才能让客户端知道有带外信息到达呢?
比如说:
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()
如果客户端尝试用'data = conn.recv(BUFFER_SIZE,MSG_OOB)'来接收所有数据,结果什么都没收到。我没有找到使用SELECT或者类似SIGURG的方法来解决这个问题。
2 个回答
0
def handler(sig_num, frame):
....
signal.signal(signal.SIGURG, handler)
fcntl.fcntl(client.fileno(), fcntl.F_SETOWN, os.getpid())
这将有助于让OOB数据被注意到。
1
也许这对某些人会有帮助(虽然很明显,但效率不是特别高的解决方案):
客户端代码如下:#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)