Я использую сокет 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