如果没有收到数据包,如何监视TCP端口的数据包和超时?

2024-04-25 06:17:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个使用python测试服务器的测试客户机。它将TCP数据包发送到服务器,服务器应在同一个TCP连接中将1个响应发送回客户端。如果它没有发送任何响应,或者发送了一个以上的响应,那么我在服务器代码中有一个bug。在

我要做的是监视TCP端口上的响应消息并将它们打印出来。如果没有响应,脚本应该在超时后继续执行。在

以下是相关代码:

import socket
import time
import multiprocessing


def get_response(response_stream, response_buffer_size):
    response_count = 1
    while True:
        response = response_stream.recv(response_buffer_size).decode()
        print("[response]", response_count, ":", response)
        response_count += 1

TCP_IP = '192.168.1.101'
TCP_PORT = 12345
BUFFER_SIZE = 1024
MESSAGE = b"Bazinga!"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(MESSAGE.encode())

print("Message sent.")

p = multiprocessing.Process(target = get_response(s,BUFFER_SIZE))
p.start()
p.join(3)

if p.is_alive():
    print("Killing thread ...")
    p.terminate()
    p.join()

s.close()
print("Socket closed.")

所以结果是p.join(3)永远无法到达,因为代码被困在get_response的这一行:response = response_stream.recv(response_buffer_size).decode()。在

脚本总是在那里等待解码下一个包,因此脚本永远不会正确终止。我做错什么了?在


Tags: 代码import服务器脚本streamsizegetresponse
1条回答
网友
1楼 · 发布于 2024-04-25 06:17:25

首先,这一行:

p = multiprocessing.Process(target = get_response(s,BUFFER_SIZE))

实际上是在主线程上调用get_response。因为,您没有像应该传递的那样传递函数名,而是调用该函数并传递target参数,即该调用的结果。在

而是你想要的

^{pr2}$

但这行不通!您无法轻松地将套接字传递给其他进程。有一些方法可以用管道来解决这个问题,但是只有在Windows上的Unix或Python3上才有实现。在

所以考虑一下我下面列出的不同方法。在

第三,您可能需要添加一些在子进程函数中突破无限循环的内容。我添加了一行来检查recv是否返回空字符串,您可以根据需要修改它。在

考虑:

import socket
import time
import multiprocessing


def worker(tcp_ip, tcp_port, response_buffer_size):
    MESSAGE = b"Bazinga!"

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((tcp_ip, tcp_port))
    s.send(MESSAGE.encode())
    print("Message sent.")

    response_count = 1
    while True:
        response = s.recv(response_buffer_size).decode()
        if len(response) == 0: break
        print("[response]", response_count, ":", response)
        response_count += 1
    # If we got here, the connection was closed
    s.close()
    print("Socket closed.")


if __name__ == "__main__":
    TCP_IP = '192.168.1.10'
    TCP_PORT = 12345
    BUFFER_SIZE = 1024

    p = multiprocessing.Process(target=worker, args=(TCP_IP, TCP_PORT, BUFFER_SIZE))
    p.start()
    p.join(3)

    if p.is_alive():
        print("Killing thread ...")
        p.terminate()
        p.join()
        print("Thread terminated.")

    print("Goodbye.")

在这里,我们将all套接字活动放在worker线程中。它拥有并打开套接字,发送“Bazinga”并处理响应。在

相关问题 更多 >