我必須編寫一個代碼,我需要在Python中使用udp協議發送數據。我需要將數據包大小設置爲網絡的MTU值。有沒有什麼辦法可以決定在python中編寫一些代碼的網絡的MTU值?如何通過代碼(在python中)找到網絡的mtu值?
4
A
回答
6
這個答案是從 http://books.google.co.il/books?id=9HGUc8AO2xQC&pg=PA31&lpg=PA31&dq#v=onepage&q&f=false (第31頁)採取
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
hostName = #ip here
Port = 9999
s.connect((hostName, Port))
s.setsockopt(socket.IPPROTO_IP, IN.IP_MTU_DISCOVER, IN.IP_PMTUDISC_DO)
try:
s.send('#' * 1473)
except socket.error:
print 'The message did not make it'
option = getattr(IN, 'IP_MTU', 14)
print 'MTU:', s.getsockopt(socket.IPPROTO_IP, option)
else:
print 'The big message was sent! Your network supports really big packets!'
1
有一個github上,依據提供此功能:
import re
import socket
import struct
import logging
import subprocess
from fcntl import ioctl
SIOCGIFMTU = 0x8921
SIOCSIFMTU = 0x8922
log = logging.getLogger(__name__)
def get_mtu_for_address(ip):
routeinfo = subprocess.check_output(['ip', 'route', 'get', ip])
dev = re.search('.*dev (\w+) .*', routeinfo).groups()[0]
mtuinfo = subprocess.check_output(['ip', 'link', 'show', dev])
mtu = re.search('.*mtu ([0-9]+) .*', mtuinfo).groups()[0]
return int(mtu)
class Iface:
def __init__(self, ifname):
self.ifname = ifname
def get_mtu(self):
'''Use socket ioctl call to get MTU size'''
s = socket.socket(type=socket.SOCK_DGRAM)
ifr = self.ifname + '\x00'*(32-len(self.ifname))
try:
ifs = ioctl(s, SIOCGIFMTU, ifr)
mtu = struct.unpack('<H',ifs[16:18])[0]
except Exception, s:
log.critical('socket ioctl call failed: {0}'.format(s))
raise
log.debug('get_mtu: mtu of {0} = {1}'.format(self.ifname, mtu))
self.mtu = mtu
return mtu
def set_mtu(self, mtu):
'''Use socket ioctl call to set MTU size'''
s = socket.socket(type=socket.SOCK_DGRAM)
ifr = struct.pack('<16sH', self.ifname, mtu) + '\x00'*14
try:
ifs = ioctl(s, SIOCSIFMTU, ifr)
self.mtu = struct.unpack('<H',ifs[16:18])[0]
except Exception, s:
log.critical('socket ioctl call failed: {0}'.format(s))
raise
log.debug('set_mtu: mtu of {0} = {1}'.format(self.ifname, self.mtu))
return self.mtu
if __name__ == "__main__":
import sys
logging.basicConfig()
mtu = None
if len(sys.argv) > 2:
dev,mtu = sys.argv[1:]
elif len(sys.argv) > 1:
dev = sys.argv[1]
else:
dev = 'eth0'
iface = Iface(dev)
if mtu is not None:
iface.set_mtu(int(mtu))
print dev,'mtu =',iface.get_mtu()
相關問題
- 1. 如何通過代碼中找到的iPhone的型號代碼
- 2. Python subprocess.popen通過網絡
- 3. 通過網址搜索的Python代碼
- 4. 通過網絡掩碼
- 5. 通過Python中的網絡抓取工具登錄到網站
- 6. 如何在Python中禁用網絡連接代碼
- 7. 如何在Python中通過網絡發送實況視頻
- 8. 如何在Python中通過網絡同步列表更改
- 9. 如何通過網絡
- 10. 如何通過網絡API
- 11. 如何通過網絡推
- 12. 使用vb網絡代碼找到最小值
- 13. 如何通過c#代碼在網絡上找到UPNP設備的IP地址(DHCP)
- 14. 如何在神經網絡中找到神經元的值
- 15. 如何通過Python上的代碼輸入到文件夾中
- 16. 如何通過Python禁用硒中的網絡安全?
- 17. 如何通過Java.io在本地網絡中找到lantronix設備API
- 18. 神經網絡的疑惑python代碼
- 19. 通過零MTU(最大傳輸單元)的網絡發送數據
- 20. 如何通過添加Python代碼
- 21. 如何通過JavaScript將網站代碼包含到iframe中?
- 22. 通過網絡的python交互式shell
- 23. 通過網絡共享的Python
- 24. 通過網絡問題的Python音頻
- 25. 如何通過網絡驅動程序填充表中的值?
- 26. 如何找到我有下面的代碼通過的malloc
- 27. 通過網絡
- 28. 通過網絡
- 29. 通過網絡
- 30. 通過網絡
是的,它的工作,但是在udp協議中使用連接是否正確? –
@RahulKatare:是的,它是:「要獲得路徑MTU的初始估計,使用connect(2)將數據報套接字連接到目標地址,並通過使用IP_MTU選項調用getsockopt(2)來檢索MTU。」。 –
什麼是IN? '輸入IN'不起作用 - 使用'IN'搜索並不容易。 –