首页 > 解决方案 > Winsock 蓝牙随后调用发送函数失败并显示 WSAECONNABORTED

问题描述

我正在尝试创建简单的 Windows 蓝牙客户端应用程序。但是,成功连接后,send() 函数仅在短时间内发送数据。随后对 send() 函数的调用失败,代码为:10053 (WSAECONNABORTED)。

来自文档:

软件导致连接中止。已建立的连接被主机中的软件中止,可能是由于数据传输超时或协议错误。

如果我理解正确,错误发生在 Windows(客户端)端而不是服务器端?可能是什么原因造成的?还有可能以某种方式重新连接这个套接字吗?

代码(简化,缺少错误检查):

#include <winsock2.h>
#include <ws2bth.h>
#include <iostream>

// {B62C4E8D-62CC-404b-BBBF-BF3E3BBB1374} ]taken from Microsoft example
DEFINE_GUID(gGuidServiceClass, 0xb62c4e8d, 0x62cc, 0x404b, 0xbb, 0xbf, 0xbf, 0x3e, 0x3b, 0xbb, 0x13, 0x74);

unsigned char dummyData [10] =
{
  0x01, 0x02, 0x03, 0x04, 0x05,
  0x01, 0x02, 0x03, 0x04, 0x05 
};

int main(void)
{
    WSAData wsaData = {0};
    SOCKADDR_BTH btAddr = {0};
    uint32_t flags = 0;
    WSAStartup(MAKEWORD(2, 2), &wsaData);

    btAddr.addressFamily = AF_BTH;
    btAddr.serviceClassId = gGuidServiceClass;
    btAddr.port = 0;
    btAddr.btAddr = // hardcoded address here
    SOCKET s = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
    if (SOCKET_ERROR == connect(s, (struct sockaddr *) &btAddr, sizeof(SOCKADDR_BTH)))
    {
        std::cout << "socket connect fail: " << WSAGetLastError() << std::endl;
        return -1;
    }
    int32_t bytes = send(s, reinterpret_cast<char *>(dummyData), 10, 0);
    if (bytes == 10)
    {
      std::cout << "first send success\n";
    }
    // success
    // do some processing
    // repeat
    bytes = send(s, reinterpret_cast<char *>(dummyData), 10, 0);
    if (bytes < 0)
    {
        // always fail with 10053
        std::cout << "Error: " << WSAGetLastError() << std::endl;
    }
    closesocket(s);
    WSACleanup();
    return 0;
}

标签: c++windowswinapibluetoothwinsock2

解决方案


推荐阅读