网络编程一

网络编程一

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()

posted @ 2016-07-26 16:59  夏日花开  阅读(159)  评论(0编辑  收藏  举报