网络编程一
1)打印设备名和IPV4地址
>>> import socket
>>> hostname=socket.gethostname()
>>> address=socket.gethostbyname(hostname)
>>> print address
172.25.254.99
2)通过端口和协议找到服务名
通过函数getservbyport()来获取名字
>>> print socket.getservbyport(53,'udp')
domain
>>> print socket.getservbyport(80,'tcp')
http
3)设定并获取套接字的时间
可以通过函数gettimeout()和settimeout()来实现
>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> s.gettimeout()
>>> print s.gettimeout()
None
>>> s.settimeout(30)
>>> print s.gettimeout()
30.0
4)修改套接字和接受缓冲区的大小
可调用函数getsockopt()和setsockopt()分别获取和修改套接字对象的属性,setsockopt()方法接受三个参数,level,optname和value。其中optname是选项名value是该选项的值。第一个参数所用的符号是(SO_*)
#!/usr/bin/python
import socket
SEND_BUF_SIZE=4096
RECV_BUF_SIZE=4096
def modify_buff_size():
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
bufsize=s.getsockopt(socket.SOL_SOCKET,socket.SO_SNDBUF)
print "buffer size [before]:%d"%bufsize
s.setsockopt(socket.SOL_TCP,socket.TCP_NODELAY,1)
s.setsockopt(socket.SOL_SOCKET,socket.SO_SNDBUF,SEND_BUF_SIZE)
s.setsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF,RECV_BUF_SIZE)
bufsize=s.getsockopt(socket.SOL_SOCKET,socket.SO_SNDBUF)
print "buffer size [after]:%d"%bufsize
if __name__=="__main__":
modify_buff_size()
5)把套接字改成阻塞或阻塞模式
可以通过函数setblocking()函数来实现,setblocking(0)表示设为非阻塞模式
>>> import socket
>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> s.setblocking(0
6)重用套接字
可以用函数setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)实现
#!/usr/bin/python
import socket
import sys
def reuse_socket_addr():
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
old_state=s.getsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR)
print "old state :%s"%old_state
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
new_state=s.getsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR)
print "new sock state:%s"%new_state
localport=8222
srv=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
srv.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
srv.bind(('',localport))
srv.listen(1)
print "listening the port %s"%localport
while True:
try:
conn,addr=srv.recv(2048)
except:
break
if __name__=="__main__":
reuse_socket_addr()