gpt4 book ai didi

sockets - 套接字SO_SNDTIMEO超时是设置值的两倍

转载 作者:行者123 更新时间:2023-12-03 11:54:15 25 4
gpt4 key购买 nike

我最近修补了GStreamer 0.10.36的副本,以在网络连接在有线/无线之间切换时使tcpclientsink超时(有关更多信息,请访问Method to Cancel/Abort GStreamer tcpclientsink Timeout)。这是一个简单的更改。我刚刚将以下内容添加到gsttcpclientsink.c的gst_tcp_client_sink_start()函数中:

struct timeval timeout;
timeout.tv_sec = 60;
timeout.tv_usec = 0;
...
setsockopt (this->sock_fd.fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout));

奇怪的是,实际超时时间(由挂钟时间衡量)始终是我设置的值的两倍。如果我将超时设置为60秒而中断了网络连接,则GStreamer/套接字需要120秒才能中止。如果我将超时设置为30秒,则将花费60秒。如果我将超时设置为180秒,则需要360秒。是否有某些我不了解的套接字可能导致此行为?我真的很想知道这是怎么回事。

最佳答案

这可能是Socket SO_RCVTIMEO Timeout is double the set value in C++/VC++的副本
我将答案粘贴在下面,因为我认为我也遇到了类似的问题。
粘贴答案
SO_RCVTIMEO和SO_SNDTIMEO不适用于所有套接字操作,您应该使用非阻塞模式和select
该行为可能会在不同的操作系统配置上更改。
在我的系统上,connect超时是我在SO_RCVTIMEO中设置的值的两倍之后。一个快速的技巧,例如在连接之前将SO_RCVTIMEO设置为x/2,而在连接成功后将其设置为x,但是正确的解决方案是使用select。
引用
关于这个问题的讨论(阅读评论以回答):

  • https://stackoverflow.com/a/4182564/4074995

  • 如何使用select获得所需的结果:
  • http://beej.us/guide/bgnet/output/html/multipage/advanced.html#select
  • C: socket connection timeout
  • 关于sockets - 套接字SO_SNDTIMEO超时是设置值的两倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21783599/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com