2015-09-10 50 views
0

我遇到了一个我正在创建的python服务器的问题。它适用于我的家用机器,但是当我尝试在不同的机器上运行它时,它不起作用。当使用pyinstaller编译,窗口immideatly关闭,当作为原料Python文件(蟒蛇2.7.10安装我家的机器,它是不是正在使用的机器上都)运行它引发错误:Python套接字 - 提供的参数无效

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" 
+0

就像我说的那样,它可以在我的家用机器上运行,但不能在这台机器上运行,所以您可能无法重现它,因为它似乎是一台机器特有的问题。 – Adam0410

+0

它没有PF_INET属性 – Adam0410

+0

尝试不同于8010的端口? – linpingta

回答

0

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

不看回溯,我看到你的代码有错误。您正试图将您的服务器绑定到无效的接口。由socket.gethostname返回的主机名不是接口。 From the documentation

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”(仅表示“本地”连接),因此不允许外部网络通信。