IPID字段意外递增

2024-09-23 06:23:15 发布

您现在位置:Python中文网/ 问答频道 /正文

简介: 我有一个练习,我只需要通过第三方将文件从S发送到D。 T在端口10000或11000上运行,这取决于我使用的是UDP还是TCP;我使用的是UDP,T的ip同时提供给s和D。 T是给定的,它所做的只是回显它返回给发送者的消息。 T的echo消息头中的一个字段称为ip\u id,它是一个计数器,随着T接收到的每条消息递增一个;为了查看ip\u id值,我需要使用原始套接字。你知道吗

S/D向T发送一条消息,然后接收回一条消息。S/D需要检查它从中获取消息的ip和端口是否与它发送到的ip和端口匹配(即,如果S/D将消息发送到1.1.1.1:5,它应该从1.1.1.1:5接收消息)。你知道吗

首先,我打开一个套接字和一个原始套接字

self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.raw_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)

然后通过执行以下操作获得端口:

self.s.sendto("1", (self.remote_server, UDP_PORT))
self.myPort = self.s.getsockname()[1]

UDP\u端口是10000,是向其发送消息的端口。 远程服务器是发送消息的ip地址。你知道吗

我还有以下方法:

def send_value(self, number_of_packets):
    for i in range(0,number_of_packets):
        self.s.sendto(BOGUS_DATA, (self.remote_server, UDP_PORT))
        self.raw_socket.recvfrom(1024)
        #self.raw_socket.recv(1024)

还有这个:

def recieve_ip_id(self):
    try:
        sent = 0
        continueFlag = True
        while continueFlag:
            self.s.sendto(BOGUS_DATA, (self.remote_server, UDP_PORT))
            #mypacket = self.raw_socket.recv(1024)
            mypacket = self.raw_socket.recvfrom(1024)
            mypacket = mypacket[0]
            continueFlag = False
            if (256*ord(mypacket[20])+ord(mypacket[21]) != UDP_PORT):
                continueFlag = True
            if (256*ord(mypacket[22])+ord(mypacket[23]) != self.myPort):
                continueFlag = True
            sent = sent + 1
        ip_id = 256 * ord(mypacket[4]) + ord(mypacket[5])
        print "packet 20 21 " + str(256*ord(mypacket[20])+ord(mypacket[21])) + " packet 4 5 " + str(256 * ord(mypacket[4]) + ord(mypacket[5])) + " packet 22 23 " + str(256*ord(mypacket[22])+ord(mypacket[23]))
        print ip_id
        return (ip_id, 0)
    except socket.timeout:
        # dummy
        return (0, 0)

它工作得很好,因为它可以正确地检查从谁那里得到消息;问题是ip\u id不会像预期的那样前进。程序运行了一段时间后,每个程序都会获得ip\ id,就好像它不再被共享一样。 我是不是检查不正确,还是有别的问题? 谢谢。你知道吗


Tags: 端口selfipid消息rawserverremote