【问题标题】:How to force a Windows Bluetooth Connect() call to timeout如何强制 Windows 蓝牙连接()调用超时
【发布时间】:2013-11-15 05:43:44
【问题描述】:

有什么办法 - 任何办法 - 强制

BluetoothAuthenticateDevice( HWND hwndParent, HANDLE hRadio, BLUETOOTH_DEVICE_INFO * pbtbi, PWSTR pszPasskey, ULONG ulPasskeyLength);

connect(SOCKET s, const struct sockaddr FAR * name, int namelen);

函数调用超时?

我尝试在 connect() 套接字上将 SO_RCVTIMEO 和 SO_SNDTIMEO 设置为不同的值,以查看它们是否会影响函数调用的长度,但无济于事 - 并且有一些关于它们是否会影响 connect() 的讨论 @987654321 @。

connect() 上的默认超时似乎约为 5 秒,显然可以为 slow as 30-45 seconds on AuthenticateDevice - 我已经看到 auth/connect 失败过程需要 80 秒。但是,如果它在前 1-2 秒内没有连接,它就不会连接 - 并且在这放弃之前,我们的 GUI 无法以任何方式显示对最终用户有意义的任何内容。额外的几秒钟确实很重要。

是否可以实际强制超时,或者是在线程中启动它并在花费太长时间时终止线程的唯一方法?

【问题讨论】:

    标签: c++ windows bluetooth


    【解决方案1】:

    在进行连接调用之前,您是否尝试过将套接字设置为非阻塞?

    long lFlag;
    SOCKET btSocket;
    
       btSocket = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
       lFlag = 1;
       ioctlsocket(btSocket, FIONBIO, &lFlag);
    

    【讨论】:

    • 这并不能解决问题 - 如果它不起作用,我需要取消 connect(),而不是让它在后台运行 - 我不希望它在后台连接然后重试失败,因为它刚刚连接......除非有办法取消非阻塞连接,如果在(例如)3秒后没有工作?
    • 您是否尝试在另一个线程尝试连接时关闭套接字?
    • 没有。问题的重点是尽量避免让后台线程创建第二个后台线程......如果这是唯一的方法,我们会这样做,但问题的答案是“不能完成”。
    猜你喜欢
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2017-01-21
    • 2015-04-11
    • 1970-01-01
    • 2021-10-03
    • 2011-11-09
    • 1970-01-01
    相关资源
    最近更新 更多