基于Python TCP套接字实现FTP文件传输的绑定报错求助
解决原生TCP Socket绑定FTP服务端的两个常见错误
先拆解你遇到的两个问题,逐个给你解决:
1. socket.gaierror: [Errno 11001] getaddrinfo failed 错误
你用 s.bind(('ftp://192.168.1.14/', 21)) 是完全错误的用法——socket的bind方法不需要带ftp://前缀,这个前缀是FTP协议的URL标识,而原生TCP Socket只需要纯IP地址(或主机名)和端口号。
正确的绑定写法应该是直接用纯IP:
import socket s = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM) # 直接使用纯IP地址,去掉ftp://前缀 s.bind(('192.168.1.14', 21))
如果想让服务端监听所有可用网卡(方便同一局域网内其他设备连接),也可以用0.0.0.0作为绑定地址:
s.bind(('0.0.0.0', 21))
2. OSError: [WinError 10013] 权限被拒绝 错误
这是Windows系统的权限限制导致的:端口号1-1023是系统预留的知名端口,普通用户权限的程序无法绑定这些端口,必须以管理员身份运行你的Python脚本。
解决方法有两个:
- 右键点击你的Python IDE或命令提示符,选择「以管理员身份运行」后再执行脚本
- 换一个大于1024的端口(比如2121),这类端口不需要特殊权限:
s.bind(('192.168.1.14', 2121))
补充:原生TCP实现文本文件传输的核心逻辑示例
解决绑定问题后,给你一个极简的文件传输框架,帮你完成作业要求:
服务端代码(发送文本文件)
import socket # 创建TCP socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定地址和无权限问题的端口 server_socket.bind(('0.0.0.0', 2121)) # 开始监听,最多允许5个等待连接 server_socket.listen(5) print("服务端启动,等待客户端连接...") # 接受客户端连接 client_socket, client_addr = server_socket.accept() print(f"已连接客户端:{client_addr}") # 读取要传输的文本文件 with open('server_text.txt', 'r', encoding='utf-8') as f: file_content = f.read() # 先发送内容长度(避免粘包) client_socket.send(str(len(file_content.encode('utf-8'))).encode('utf-8')) # 等待客户端确认 client_socket.recv(1024) # 发送文件内容 client_socket.send(file_content.encode('utf-8')) # 关闭连接 client_socket.close() server_socket.close()
客户端代码(接收文本文件)
import socket # 创建TCP socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务端(替换为你的服务端IP和端口) client_socket.connect(('192.168.1.14', 2121)) # 接收文件长度 file_length = int(client_socket.recv(1024).decode('utf-8')) # 发送确认信号 client_socket.send(b'ok') # 分段接收文件内容 received_content = b'' while len(received_content) < file_length: chunk = client_socket.recv(1024) if not chunk: break received_content += chunk # 写入本地文件 with open('client_text.txt', 'w', encoding='utf-8') as f: f.write(received_content.decode('utf-8')) print("文件接收完成") # 关闭连接 client_socket.close()
这个示例是极简版本,足够完成作业的文本传输需求,实际场景中可以再补充异常处理(比如文件不存在、连接中断等)。
内容的提问来源于stack exchange,提问作者Ahmad Anis
相关产品推荐
相关产品推荐

