我有这个程序,现在应该只监听端口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时,尽管数据已成功从其他地方发送,但它仅接受客户端,但似乎未接收任何数据。 .. 请帮助你们
答案 0 :(得分:1)
端口80和所有<1024端口是特权端口,您的程序必须以root用户身份运行才能正确绑定到这些端口。我猜您正在Windows上运行,因为在任何unix上调用s.bind(("127.0.0.1", 80))
都会立即导致PermissionError: [Errno 13] Permission denied
异常。
我不确定Windows如何处理特权端口,但是Google的快速搜索指向windows firewall messing with your program。
适当的Web服务器(例如Nginx或Apache)以root身份启动,绑定到端口80,然后立即转为特权较低的用户,因为在root环境下运行很危险。
P.S .:一些建议:
您可以跳过socket.gethostname()
。如果希望仅从计算机访问程序,请使用ip 127.0.0.1
;如果要从网络上的任何计算机访问,请使用ip 0.0.0.0
。
您应该尝试尽快切换到Python 3,因为Python 2在这一点上已经基本失效。不要习惯于二的语法,您将在几年的学习中重新学习它。