使用 C++ 在 Windows 上建立蓝牙连接(出现错误 10060)
Posted
技术标签:
【中文标题】使用 C++ 在 Windows 上建立蓝牙连接(出现错误 10060)【英文标题】:Making a bluetooth connection on windows using C++ (getting error 10060) 【发布时间】:2012-11-17 11:02:18 【问题描述】:我正在尝试让 2 台带蓝牙的笔记本电脑进行连接。 这是我用来制作服务器的代码:
WSADATA wsd;
WSAStartup (MAKEWORD(1,0), &wsd);
SOCKET server_socket = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
SOCKADDR_BTH sa;
memset(&sa, 0, sizeof(sa));
sa.addressFamily = AF_BTH;
sa.port = 0 & 0xFF;
if(0 != bind(server_socket, (SOCKADDR *)&sa, sizeof(sa)))
std::cout << "BIND ERROR: " << WSAGetLastError () << std::endl;
closesocket(server_socket);
return false;
if(0 != listen (server_socket, 5))
std::cout << "LISTEN ERROR: " << WSAGetLastError () << std::endl;
closesocket(server_socket);
return false;
SOCKADDR_BTH sa2;
int size = sizeof(sa2);
SOCKET s2 = accept(server_socket, (SOCKADDR*)&sa2, &size);
if(s2 == INVALID_SOCKET)
std::cout << "ACCEPT ERROR: " << WSAGetLastError () << std::endl;
return false;
else
std::cout << "Connected? " << WSAGetLastError () << std::endl;
以下为客户:
WSADATA wsd;
WSAStartup (MAKEWORD(1,0), &wsd);
SOCKET client_socket = socket (AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.addressFamily = AF_BTH;
sa.btAddr = (BTH_ADDR)d.getDeviceAddress();
sa.port = 0;
sa.serviceClassId = *d.getLpServiceClassId();
if(client_socket == INVALID_SOCKET)
std::cout << "SOCKET ERROR: " << WSAGetLastError () << std::endl;
return false;
if (0 != connect (client_socket, (SOCKADDR *)&sa, sizeof(sa)))
std::cout << "CONNECT ERROR: " << WSAGetLastError () << std::endl;
return false;
else
//std::cout << "CONNECT ERROR: " << WSAGetLastError () << std::endl;
//Perform error handling.s
send(client_socket, "ABC",3,0);
closesocket (client_socket);
return true;
其中“b”是我作为参数给出的蓝牙设备,蓝牙设备类具有以下字段:
LPSOCKADDR local_address;
LPSOCKADDR device_address;
LPGUID lp_service_class_id;
这应该有效。但是当我尝试连接到服务器时,服务器什么也得不到,客户端给我错误 10060。
这个错误意味着:
WSAETIMEDOUT 10060
The I/O timed out at the Bluetooth radio level (PAGE_TIMEOUT).
这里有没有人在 Windows 上使用过蓝牙堆栈并且知道这个错误来自哪里?
【问题讨论】:
【参考方案1】:您是否已向蓝牙 SDP 注册您的服务?如果不是,我猜,您将无法在客户端代码中使用当前方法进行连接。来自 MSDN:
The bind function does not automatically advertise the server application using the Bluetooth SDP; applications must call the WSASetService function to be found by remote Bluetooth applications.
还可以查看bind
和connect
funcs 的蓝牙文档:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa362901%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/aa362901%28v=vs.85%29.aspx
据我了解,另一种方法是您可以尝试在服务器端和客户端显式指定port
。但这仅适用于游乐场应用程序就足够了。
有关蓝牙使用的更多信息,您可以参考http://msdn.microsoft.com/en-us/library/windows/desktop/aa363058%28v=vs.85%29.aspx。
【讨论】:
以上是关于使用 C++ 在 Windows 上建立蓝牙连接(出现错误 10060)的主要内容,如果未能解决你的问题,请参考以下文章