我正在使用python 2.7套接字建立与服务器的TCP连接,发送网段(直径请求,例如CCR)并接收答案(例如,CCA)。
当我对代码进行一些重构以便根据先前的答案发送一些请求数据时,我注意到-通过检查TCP转储-我的第三个请求(第3个socket.send(..))是通过URG发送的TCP层上的标志,这似乎会导致接收应用程序失败并关闭连接。
该代码的先前版本可以愉快地用于多个发送/接收(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