此代码可以创建套接字,连接到选定的服务器和端口,以及打印回复。我有一个问题,我怎么能听一下这个端口呢?例如。我希望收听选定的端口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)
答案 0 :(得分:0)
如果我正确理解您需要等待一次20秒,您可以尝试设置适合您要求的套接字超时。
s.settimeout(20)
reply = s.recv(4096)
但是,您无法保证立即获得所有数据包。正如评论中提到的那样,你应该循环。执行此操作的方法是将套接字置于非阻塞模式。
在你的循环之外,你需要一个buffer_variable
来保存recv()的总结果。
在进入循环之前,您将启动计时器。进入循环后,您将开始在套接字上调用recv()
,同时将结果保存在local_variable
中。每当您在local_variable
中获得新内容时,都会将其附加到buffer_variable
。
当计时器到期时,您将break
循环,并相应地处理buffer_variable
的数据。