Python 3.4监听选定的服务器和端口

时间:2015-06-18 19:12:55

标签: python sockets

此代码可以创建套接字,连接到选定的服务器和端口,以及打印回复。我有一个问题,我怎么能听一下这个端口呢?例如。我希望收听选定的端口20秒并打印此时将要发送的所有数据包。这段代码可以吗?

import socket
import sys

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

except socket.error as msg:
    print("Failed to create socket. Error code: " + str(msg[0]) + ' , Error message : ' + msg[1])
    sys.exit();

print('Socket Created')

host = #server
port = #port
try:
    remote_ip = socket.gethostbyname( host )

except socket.gaierror:
    print('Hostname could not be resolved. Exiting')
    sys.exit()

print('Ip address of ' + host + ' is ' + remote_ip)

s.connect((remote_ip , port))

print('Socket Connected to ' + host + ' on ip ' + remote_ip)

reply = s.recv(4096)

print(reply)

1 个答案:

答案 0 :(得分:0)

如果我正确理解您需要等待一次20秒,您可以尝试设置适合您要求的套接字超时。

s.settimeout(20)
reply = s.recv(4096)

Python Socket settimeout()

但是,您无法保证立即获得所有数据包。正如评论中提到的那样,你应该循环。执行此操作的方法是将套接字置于非阻塞模式。

在你的循环之外,你需要一个buffer_variable来保存recv()的总结果。

在进入循环之前,您将启动计时器。进入循环后,您将开始在套接字上调用recv(),同时将结果保存在local_variable中。每当您在local_variable中获得新内容时,都会将其附加到buffer_variable

当计时器到期时,您将break循环,并相应地处理buffer_variable的数据。