首页 > 解决方案 > 在端口 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 时,它只接受客户端但似乎没有收到任何数据,尽管数据已从其他地方成功发送.. ..请帮助伙计们

标签: pythonpython-2.7socketshttpport80

解决方案


端口 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 基本上已经死了。不要习惯二的语法,你会在几年内重新学习它。


推荐阅读