为什么Python套接字实现发送带有URG标志的TCP段?

时间:2019-04-21 21:45:30

标签: python sockets tcp flags

我正在使用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

0 个答案:

没有答案