说明: 我有一个练习,我需要通过第三方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,好像它不再共享一样。 我没有正确检查某些东西,还是其他东西? 感谢。