0

我正在创建的 python 服务器有问题。它可以在我的家用机器上运行,但是当我尝试在另一台机器上运行它时它不起作用。当使用 pyinstaller 编译时,窗口会立即关闭,当作为原始 python 文件运行时(python 2.7.10 安装在我的家用机器和它不工作的机器上),它会抛出错误:

Traceback (most recent call last):
  File "fileModifyServer.py", line 136, in <module>
    startServer()
File "fileModifyServer.py", line 11, in startServer
  serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
File "N:\Python27\lib\socket.py", line 191, in __init__
  _sock = _realsocket(family, type, proto)
socket.error: [Errno 10022] An invalid argument was supplied

我引用的代码如下:

import socket

def startServer():
    global serversocket

    serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serversocket.bind((socket.gethostname(), 8010))
    serversocket.listen(5)
    print "Server started"
4

1 回答 1

0

你的回溯很奇怪。它在尝试实例化套接字时指示一条线,这表明您的 python 安装或网络堆栈存在问题。它还表明错误发生在第 11 行,但在您的代码中,有问题的行出现在第 6 行。我不确定这里是如何发生的,但我知道如果您在程序运行时编辑文件然后它崩溃了。回溯只是从导致错误的相关文件中打印出行号,并且在错误发生之前似乎不会读取文件源;因此,回溯将反映修改文件中的行,这不是程序编译时存在的行,因此不是实际导致问题的行。

在不查看回溯的情况下,我确实看到您的代码有错误。您正试图将您的服务器绑定到一个无效的接口。socket.gethostname 返回的主机名不是接口。从文档中

If you want to know the current machine’s IP address, you may want to use gethostbyname(gethostname()). 
This operation assumes that there is a valid address-to-host mapping for the host, and the assumption does not always hold.

# for example
local_ip_address = socket.gethostbyname(socket.gethostname())

这将返回您本地 IP 地址的字符串表示形式。不幸的是,这仍然会引发错误,因为它不是您可以绑定的接口。

您可以绑定的一些接口包括“0.0.0.0”,表示所有可用接口,以及“localhost”,表示仅“本地”连接,因此不允许外部网络流量。

于 2015-12-25T03:29:19.420 回答