Python - отправка срочных данных (tcp)

1

У меня возникла проблема с отправкой срочных данных в 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)

ОК, полученные данные.

Но как я могу указать, что информация 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 или smth, как SIGURG, чтобы решить проблему.

  • 1
    На всякий случай вы не знали, что данные TCP OOB ненадежны, сломаны и несовместимы в разных операционных системах. Вот почему никто не использует его, и, в свою очередь, поэтому никто не позаботился об этом исправить.
Теги:
sockets
tcp

2 ответа

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)
0

обработчик def (sig_num, frame):.... signal.signal(signal.SIGURG, обработчик) fcntl.fcntl(client.fileno(), fcntl.F_SETOWN, os.getpid()) Это поможет быть замеченным OOB данные.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню