Python挂起socket receive,而Wireshark显示所有received

2024-05-15 13:40:04 发布

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

我在编写udp套接字接收器程序时遇到问题。你知道吗

我不使用udp_source.start_transmission()控制传输源(只在何时启动)。你知道吗

我还使用Wireshark监控网络流量。你知道吗

根据Wireshark-我得到了所有的数据。e、 g:源发送的udp数据包有60000000字节。你知道吗

然而,在Python中,程序在大约3/4的数据之后挂起在tmp = sock.recvfrom(1500)。 e、 g:while循环未达到停止条件。你知道吗

    sock = socket.socket(family=socket.AF_INET, 
                  type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 512 * 1024)
    sock.connect((ip, port)) 

    udp_source.start_transmission()

    cntr = 0
    l = []
    total_size = 60000000
    rec_bytes_len = 0

    while rec_bytes_len < total_size:
        r, w, e = select.select([sock], [], [sock], 60)
        if r:
            tmp = sock.recvfrom(1500)
            rec_bytes_len += len(tmp)
        cntr += 1
        if cntr % 1000 == 0:
            print(cntr)  

我试过:

  1. 释放接收器缓冲区: sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1024 * 512 * 1024)-同样的行为
  2. 添加大量超时sock.settimeout(60)-相同的行为
  3. 使套接字解锁-得到一个非阻塞套接字操作无法立即完成异常

有人能帮忙吗?你知道吗

谢谢你。你知道吗

编辑

设法使它工作。 结果我没有增加足够的缓冲。 一旦我使缓冲区非常大(1 GB),我得到了所有的数据通过。 不知道为什么会这样,但这是。。。你知道吗


Tags: 数据程序sourcelenbytessocketstarttmp