python - 在端口 80 上侦听的 Python 套接字未接收到数据
问题描述
我有这个程序,它现在应该只监听端口 80 并从浏览器连接或另一个 python 脚本接收数据。这段代码:
import socket # Import socket module
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname() # Get local machine name
port = 80 # Reserve a port for your service.
s.bind(("192.168.252.7", port)) # Bind to the port
s.listen(5) # Now wait for client connection.
while True:
c, addr = s.accept() # Establish connection with client.
print 'Got connection from', addr
print c.recv(1024)
c.close() # Close the connection
这都是从tutorialspoint复制的。此代码接收数据,当端口设置为 80 以外的任何值(例如 8080、12345)时,但当它是 80 时,它只接受客户端但似乎没有收到任何数据,尽管数据已从其他地方成功发送.. ..请帮助伙计们
解决方案
端口 80 和所有 <1024 端口都是特权端口,您的程序必须以 root 身份运行才能正确绑定到这些端口。我猜你是在 Windows 上运行的,因为任何 unix 调用都会立即s.bind(("127.0.0.1", 80))
导致PermissionError: [Errno 13] Permission denied
异常。
我不确定 Windows 如何处理特权端口,但快速谷歌搜索指向Windows 防火墙与您的程序混淆。
适当的 Web 服务器,例如 Nginx 或 Apache,以 root 身份启动,绑定到端口 80 并立即下降到权限较低的用户,因为在 root 下运行是危险的。
PS:几点建议:
您可以跳过socket.gethostname()
. 127.0.0.1
如果您希望您的程序只能从您的机器访问,请使用 ip ,0.0.0.0
如果您希望可以从网络上的任何机器访问,请使用 ip。
您应该尝试尽快切换到 Python 3,因为此时 Python 2 基本上已经死了。不要习惯二的语法,你会在几年内重新学习它。
推荐阅读
- python - 从现有日期在 Pandas 中创建新的日期时间列
- c++ - 用自己的常量值定义变量的类型
- linux - 如何强制 Firefox 使用特定的共享库来解码视频?
- azure-pipelines - 即使我是项目集合管理员组,也无法更改集合设置中的管道设置
- spring - 当 DataSources /JdbcTemplates 不由 Spring 管理时使用 Spring Boots @Transactional
- firebase - Firebase 托管的应用程序将不允许 ios 通过谷歌登录,并且无法识别证书
- javascript - 如何从 intl-tel-input 中删除国家/地区
- angular - 关于查询生成器的建议
- asp.net - 动态网格视图分页
- python - 使用 Python 从文本文件中删除空格和回车