Skip to content

Commit 437c9e8

Browse files
committed
socket udp bind
1 parent 2494b77 commit 437c9e8

16 files changed

+434
-2
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,10 @@ python的强大之处有很大的一方面在于它有各种各样非常强大
255255

256256
## [cProfile](content/cProfile.md)
257257

258+
## [ping](content/ping.md)
259+
260+
## [six](content/six.md)
261+
258262
## [tools](content/tools.md)
259263

260264
## [Other_thing](content/other_thing.md)

code/ipaddress_demo.py

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
# -*- coding: utf-8 -*-
2+
3+
import struct
4+
import socket
5+
import ipaddress
6+
7+
8+
def ip2hex(ip, encoding='utf-8'):
9+
if type(ip) in [bytes, str]:
10+
ip = ip.decode(encoding)
11+
elif type(ip) not in [unicode]:
12+
raise ValueError("IPAddress not valid")
13+
ip_address = ipaddress.ip_address(ip)
14+
return ip_address.packed.encode('hex')
15+
16+
17+
def hex2ip(ip):
18+
return str(ipaddress.ip_address(int(ip, 16)))
19+
20+
21+
def int2ip(ip):
22+
return str(ipaddress.ip_address(ip))
23+
24+
25+
def ip2int(ip, encoding='utf-8'):
26+
if type(ip) in [bytes, str]:
27+
ip = ip.decode(encoding)
28+
elif type(ip) not in [unicode]:
29+
raise ValueError("IPAddress not valid")
30+
return int(ipaddress.ip_address(ip))
31+
32+
33+
def ip2long(ip):
34+
packed_ip = socket.inet_aton(ip)
35+
return struct.unpack("!L", packed_ip)[0]
36+
37+
38+
def hex2ip_old(ip):
39+
return ".".join(map(str, map(lambda x: int(x, 16),
40+
[ip[i:i + 2] for i in
41+
xrange(0, len(ip), 2)])))
42+
43+
44+
def ip2hex_old(ip):
45+
return "%02x%02x%02x%02x" % tuple(map(int, ip.split('.')))
46+
47+
48+
def ip2hex_struct(ip):
49+
ip = map(int, ip.split('.'))
50+
return struct.pack('BBBB', *ip).encode('hex')
51+
52+
53+
def hex2ip_struct(ip):
54+
return '.'.join(map(str, struct.unpack('BBBB', ip.decode('hex'))))
55+
56+
57+
def ip2int_old(ip):
58+
ip = map(int, ip.split('.'))
59+
return (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3]
60+
61+
62+
def int2ip_old(ip):
63+
ip = '{:032b}'.format(ip)
64+
return '.'.join(map(str,
65+
[int(ip[:8], 2), int(ip[8:16], 2), int(ip[16:24], 2),
66+
int(ip[24:], 2)]))
67+
68+
69+
def ip2int_struct(ip):
70+
ip = map(int, ip.split('.'))
71+
return struct.unpack('>I', struct.pack('>BBBB', *ip))[0]
72+
73+
74+
def int2ip_struct(ip):
75+
return '.'.join(
76+
map(str, struct.unpack('BBBB', '{:x}'.format(ip).decode('hex'))))
77+
78+
79+
def ip_int2hex(ip):
80+
return struct.pack('>I', ip).encode('hex')
81+
82+
83+
def ip_hex2int(ip):
84+
return struct.unpack('>I', ip.decode('hex'))[0]
85+
86+
87+
def parse_peers(peers):
88+
ip, port = peers[:8], peers[8:]
89+
return '{}:{}'.format(hex2ip(ip), int(port, 16))
90+
91+
92+
def parse_peers_struct(peers):
93+
ip_port = struct.unpack('>BBBBH', peers.decode('hex'))
94+
return '{}.{}.{}.{}:{}'.format(*ip_port)
95+
96+
97+
def combine_peers(peers):
98+
ip, port = peers.split(":")
99+
return '%s%04x' % (ip2hex(ip), int(port))
100+
101+
102+
def combine_peers_struct(peers):
103+
ip, port = peers.split(':')
104+
ip = map(int, ip.split('.'))
105+
port = int(port)
106+
ip_port = ip + [port]
107+
return struct.pack('>BBBBH', *ip_port).encode('hex')
108+
109+
110+
if __name__ == '__main__':
111+
# print ip2hex('127.12.13.14')
112+
# print ip2hex_struct('127.12.13.14')
113+
# print hex2ip('7f0c0d0e')
114+
# print hex2ip_struct('7f0c0d0e')
115+
# print ip2int('127.12.13.14')
116+
# print struct.unpack('BBBB', '7f0c0d0e'.decode('hex'))
117+
# print repr(struct.pack('>I', 10240099))
118+
# print struct.pack('BBBB', 127, 12, 13, 14).encode('hex')
119+
# print combine_peers('127.12.13.14:1234')
120+
# print struct.unpack('>BBBBH', '7f0c0d0e04d2'.decode('hex'))
121+
# print parse_peers_struct('7f0c0d0e04d2')
122+
# print struct.pack('>BBBBH', 127, 12, 13, 14, 1234).encode('hex')
123+
# print combine_peers_struct('127.12.13.14:1234')
124+
125+
print ip2int('127.12.13.14')
126+
print ip2int_old('127.12.13.14')
127+
print int2ip_old(2131496206)
128+
print int2ip_struct(2131496206)
129+
print ip2int_struct('127.12.13.14')
130+
# print struct.unpack('BBBB', '{:x}'.format(2131496206).decode('hex'))
131+
# print struct.unpack('>I', '{:x}'.format(2131496206).decode('hex'))
132+
# print repr(struct.pack('>I', 2131496206))
133+
# print repr(struct.unpack('>I', '7f0c0d0e'.decode('hex')))
134+
# print struct.unpack('>I', struct.pack('>BBBB', 127, 12, 13, 14))
135+
print struct.pack('>I', 2131496206).encode('hex')
136+
print struct.unpack('>I', '7f0c0d0e'.decode('hex'))[0]

code/selenium_screenshot.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from selenium import webdriver
2+
3+
driver = webdriver.Chrome() # 打开 Chrome 浏览器
4+
5+
# 将刚刚复制的帖在这
6+
driver.get("https://morvanzhou.github.io/")
7+
driver.find_element_by_xpath(u"//img[@alt='强化学习 (Reinforcement Learning)']").click()
8+
driver.find_element_by_link_text("About").click()
9+
driver.find_element_by_link_text(u"赞助").click()
10+
driver.find_element_by_link_text(u"教程 ▾").click()
11+
driver.find_element_by_link_text(u"数据处理 ▾").click()
12+
driver.find_element_by_link_text(u"网页爬虫").click()
13+
14+
# 得到网页 html, 还能截图
15+
html = driver.page_source # get html
16+
driver.get_screenshot_as_file("./img/sreenshot1.png")
17+
driver.close()

code/six_demo.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# coding=utf-8
2+
3+
import six
4+
5+
six.print_(six.PY2)
6+
six.print_(six.PY3)
7+
8+
six.print_(six.string_types)

code/socket_udp_bind.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# -*- coding: utf-8 -*-
2+
3+
import sys
4+
import socket
5+
import threading
6+
7+
host = '127.0.0.1'
8+
port = 1234
9+
bufsize = 1024
10+
11+
12+
def server(udpsock):
13+
print "Waiting for message ... "
14+
while 1:
15+
data, addr = udpsock.recvfrom(bufsize)
16+
print '[%s:%s]: %s' % (addr[0], addr[1], data)
17+
18+
19+
def main(host, port):
20+
21+
udpsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
22+
udpsock.bind((host, port))
23+
threading.Thread(target=server, args=(udpsock,)).start()
24+
25+
import pdb
26+
pdb.set_trace()
27+
28+
# while 1:
29+
# data = raw_input(">")
30+
# if not data:
31+
# break
32+
# udpsock.sendto(data, (host, port))
33+
# data, addr = udpsock.recvfrom(bufsize)
34+
# if not data:
35+
# break
36+
# print data
37+
38+
udpsock.close()
39+
40+
41+
if __name__ == '__main__':
42+
if len(sys.argv) > 2:
43+
host = sys.argv[1]
44+
port = int(sys.argv[2])
45+
main(host, port)

content/contextlib.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,20 @@ with reckon_time():
182182
print countsum(100000)
183183
```
184184

185+
或者是用来忽略异常
186+
187+
```
188+
@contextlib.contextmanager
189+
def ignore_errors(*errors):
190+
if not errors:
191+
errors = Exception
192+
try:
193+
yield
194+
except errors:
195+
pass
196+
197+
```
198+
185199
如果有多个上下文嵌套的话,可以使用双重 with 语句,或者 with 语句并列。如果 Python 版本小于 2.7 则需要使用 `contextlib.nested` 来减少 with 的嵌套
186200

187201
```

content/datetime.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,3 +308,24 @@ def datetime_next_day(datetime_obj):
308308
return datetime_obj + timedelta(days=1)
309309
310310
```
311+
312+
### 获得当天剩余时间
313+
314+
```
315+
# -*- coding: utf-8 -*-
316+
import datetime
317+
318+
319+
def get_today_seconds_left():
320+
now = datetime.datetime.now()
321+
end = now.date() + datetime.timedelta(days=1)
322+
return int(time.mktime(end.timetuple()) - time.mktime(now.timetuple()))
323+
324+
325+
def get_daily_left_seconds():
326+
now = datetime.datetime.now()
327+
last_second = datetime.datetime.combine(datetime.date.today(),
328+
datetime.time.max)
329+
return int((last_second - now).total_seconds())
330+
331+
```

content/ipaddress.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ IP Address 解析库
66
# -*- coding: utf-8 -*-
77
88
import struct
9+
import socket
910
import ipaddress
1011
1112
@@ -34,6 +35,11 @@ def ip2int(ip, encoding='utf-8'):
3435
return int(ipaddress.ip_address(ip))
3536
3637
38+
def ip2long(ip):
39+
packed_ip = socket.inet_aton(ip)
40+
return struct.unpack("!L", packed_ip)[0]
41+
42+
3743
def hex2ip_old(ip):
3844
return ".".join(map(str, map(lambda x: int(x, 16),
3945
[ip[i:i + 2] for i in

content/itertools.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## itertools
22

3-
### 迭代器
3+
### 迭代器
44

55
迭代器 (iterator) 是可迭代对象的一种。
66

@@ -163,4 +163,6 @@ StopIteration
163163
- product(p, q, ... [,repeat=1]) 取循环集合的笛卡尔积 如 product([1,2,3,4],['a','b','c']) 得到 (1,'a'),(1,'b'),(1,'c'),(2,'a'),(2,'b'),(2,'c')...(4,'b'),(4,'c')
164164
- permutations(q[,r=1]) q 做 r 位的全排列 如 permutations('abcde',3) 得到 ('a', 'b', 'c'),('a', 'b', 'd')...('c','d','e') |共 60 组
165165
- combinations(q,r=1) q 做 r 位的全组合 如 combinations('abcde',3) 得到 ('a', 'b', 'c'),('a', 'b', 'd')...('c','d','e') |共 10 组
166-
- combinations_with_replacement(p,r) 与 combinations 类似 ,但是允许元素重复出现,如 combinations_with_replacement('abcde',3) 得到 ('a', 'a', 'a'),('a', 'a', 'b'),...('e','e','e') | 共 125 组
166+
- combinations_with_replacement(p,r) 与 combinations 类似 ,但是允许元素重复出现,如 combinations_with_replacement('abcde',3) 得到 ('a', 'a', 'a'),('a', 'a', 'b'),...('e','e','e') | 共 125 组
167+
168+

content/other_thing.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ npm install http-server -g
7676
- urllib.quote <-> urllib.unquote
7777
- urlparse.urlparse <-> urlparse.urlunparse
7878

79+
7. 转义
80+
81+
- re.escape 转义非法字符串
82+
7983
```
8084
# -*- coding: utf-8 -*-
8185

content/pdb.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,9 @@ pdb.set_trace()
1010
```
1111

1212
然后就可以了。
13+
14+
2018-09-15
15+
16+
需注意两点
17+
1. 在 pdb 中不能创建新的变量
18+
2. 在 pdb 中不能给已有的变量赋值

content/ping.md

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
## ping
2+
3+
服务器上最常见的网络命令,测试网络是否通畅,能否抵达目标。
4+
5+
一般用来根据能否 ping 通来判断自身的网络连接或者目标的网络连接,根据 ping 的时长来检测网络连接状况。
6+
7+
ping 使用 ICMP(internet control message protocol) 协议,不在 TCP/IP 协议层中,所以没有特定的端口号,如果强行使用 socket 连接,可以设置端口号为 1.
8+
9+
在七层网络模型中,icmp 是第三层协议,TCP/UDP 是第四层协议。
10+
11+
[An ICMP Reference](https://danielmiessler.com/study/icmp/)
12+
13+
如果使用 ping 命令来判断是否网络通畅
14+
15+
```
16+
import os
17+
18+
status = os.system("ping -c 1 www.baidu.com");
19+
20+
if status == 0:
21+
print '连接成功!';
22+
else:
23+
print '连接失败';
24+
25+
```
26+
27+
或者使用 ping 这个 python 库
28+
29+
```
30+
# -*- coding: utf-8 -*-
31+
32+
import sys
33+
import ping
34+
import socket
35+
36+
37+
def ping_test(host):
38+
try:
39+
ping.quiet_ping(host, count=1)
40+
except socket.error:
41+
return False
42+
else:
43+
return True
44+
45+
46+
if __name__ == '__main__':
47+
48+
if len(sys.argv) < 2:
49+
print """
50+
Uasge: python ping_test.py baidu.com
51+
52+
"""
53+
sys.exit(0)
54+
print ping_test(sys.argv[1])
55+
56+
```
57+
58+
使用时需注意使用 root 权限运行。

0 commit comments

Comments
 (0)