简介: 我有一个练习,我只需要通过第三方将文件从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,就好像它不再被共享一样。 我是不是检查不正确,还是有别的问题? 谢谢。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐