IPID字段意外增加

时间:2014-01-08 12:27:51

标签: python sockets udp raw-sockets

说明: 我有一个练习,我需要通过第三方T从S到D发送文件。 T在端口10000或11000上运行,具体取决于我使用UDP还是TCP;我使用UDP,并且T的ip被给予S和D. 给出了T,它所做的只是回到发送者的回复消息。 T的echo消息头中的一个字段叫做ip_id - 一个计数器,每个消息T收到一个计数器;为了查看我需要使用原始套接字的ip_id值。

S / D向T发送消息,然后应该接收回消息。 S / D需要检查它收到消息的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_PORT是10000,是发送消息的端口。 remote_server是发送消息的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_id不会按预期提前。程序运行一段时间后,每个程序都会获得ip_id,好像它不再共享一样。 我没有正确检查某些东西,还是其他东西? 感谢。

0 个答案:

没有答案