Socket.Accept永远接受,并且无阻塞返回错误

时间:2019-05-26 20:06:12

标签: python sockets

我在运行仅连接到我自己的IP地址的代码时遇到了麻烦。 socket.send函数可以正常工作,但是socket.accept需要太长时间才能运行。有人可以帮我吗?这可能是我还没有见过的简单答案,因为我只有13岁。

我通过使用另一个代码扫描端口来检查端口是否正确,并且已在python IDLE和Mac终端中运行它。我已经尝试过'www.google.com','localhost',','127.0.0.1'和我的个人IP地址,但是socket.accept仍然无法使用

代码: 扫描程序代码,返回20000,也就是找不到端口

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
for port in range(0,20001):
    try:
        s.setblocking(False)
        s.bind(('127.0.0.1',port))
        s.listen(1);
        c,addr=s.accept()
        break
    except:
        if port%1000==0:
            print(port)

接受代码:

import socket
s=socket.socket(socket.AF_UNIX,socket.SOCK_DGRAM);
s.setblocking(False)
s.bind(('127.0.0.1',20000))
s.listen(1);
c,addr=s.accept()

我希望接受代码不返回任何内容,而扫描仪返回0-20000之间的数字。这是我关于Stack-overflow的第一篇文章,所以请告诉我下一篇文章中有哪些更好的方法(:

1 个答案:

答案 0 :(得分:0)

此行对于接收传入的TCP连接不正确:

s=socket.socket(socket.AF_UNIX,socket.SOCK_DGRAM);

它应该是:

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);

此外,s.setblocking(False)可能不是您要执行的操作,因为您可能希望accept()阻塞直到收到传入的TCP连接。

更新:除了上述问题外,另一个问题是问题中张贴的所谓端口扫描代码实际上并未扫描任何端口,因为它从未尝试建立传出TCP连接。作为参考,下面是该代码的一个版本,该版本实际上尝试连接到localhost上的端口0-20000,然后打印出它能够连接到的端口:

import socket

connectedPorts = []
for port in range(0,20001):
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
    try:
        s.connect(('127.0.0.1',port))
        print("Connect succeeded on port %i" % port)
        connectedPorts.append(port)
    except Exception as e:
        print "Port %i: %s" % (port, e)
    s.close()

print("")
print("Connect succeeded on the following ports: ", connectedPorts)

...并且为完整起见,这是工作在端口20000上的代码:

import socket

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.bind(('127.0.0.1',20000))
s.listen(1);
print("Calling accept...")
c,addr=s.accept()
print("Accept returned: [%s, %s]" % (c,addr))