Почему реализация сокета Python отправляет сегмент TCP с URG-флагом? - PullRequest
0 голосов
/ 22 апреля 2019

Я использую сокет Python 2.7 для установления TCP-соединения с сервером, отправки сегментов (запросов диаметра, таких как CCR) и получения ответов (например, CCA).

Когда я немного изменил кодЧтобы отправить некоторые данные запроса на основе предыдущего ответа, я заметил - проверив дамп TCP - что мой третий запрос (3-й socket.send (..)) отправляется с флагом URG на уровне TCP, который, кажется, вызывает получениеПриложение не может завершить соединение и закрыть его.

Предыдущая версия кода успешно работает для нескольких пар send / recv (CCR / CCA).Мне не удается выяснить, какие изменения в коде могут привести к тому, что реализация сокета отправит флаг URG.

Работает

main.py

sd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sd.settimeout(5)
try:
    sd.connect((someHost, somePort))
except ...
... # Create stream for CER
sd.send(cer)
try:
    connection.recv(1024)
except ...

ccrCreator = creator.CCRCreator(...) # A class that knows to create the stream
manager = mpc.Manager()
queue = manager.Queue()
ccrCreator.subscribe(queue)
proc = multiprocessing.Process(target = ccrCreator.start)
... # The ccrCreator's start method creates the CCR stream to be sent and puts
... # it on the queue
proc.start()
...
while True:
    stream = queue.get()
    if stream == None:
        break
    else:
        sd.send(stream)
        try:
            result = sd.recv(2048)
        except ...
... # Working fine, no URG flag sent at any moment

Не работает

main.py

sd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sd.settimeout(5)
try:
    sd.connect((someHost, somePort))
except ...
... # Create stream for CER
sd.send(cer) # Send without URG flag
try:
    sd.recv(1024)
except ...

ccrCreator = creator.CCRCreator(sd, ...) # A class that knows to create the stream
ccrCreator.createCCRs()

creator.py

class CCRCreator(object)
    def __init__(self, sd)
        self.sd = sd

    def createCCRs(self)
        for line in confFile.readlines
             .... # get some info from conf into ccrInfo
             self.sendRecvOneCCR(ccrInfo)

    def sendRecvOneCCR(self, ccrInfo)
        ... # Create stream from ccrInfo
        self.sd.sendall(stream)
        # Works fine first time - no URG flag sent
        # Second time, URG flag is sent and receiver closes socket
        # Why??
        try:
            result = self.sd.recv(2048) # Result as expected first time
            ... # parse result and put some info from it on self
            ... # to be used in the next stream (CCR)
        except ...

        return
...