c++ - 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;
}
解决方案
推荐阅读
- python - pd.read_sql,如何转换数据类型?
- apache - 在 Xampp 中托管数据库(在单独的固定端口中)
- java - 为什么 java.net.URI isAbsolute() 方法为具有片段的 URI 返回 true?
- python - 如何写正确的条件?(分棋)
- java - 如何将静态对象发送到 Thymaf 视图?
- python - 带有管道的 termios 中的“设备的 ioctl 不合适”
- vba - Workbook.Unprotect 在 ACCESS VBA 中不起作用
- dynamic-linking - 可执行文件未链接到我想要的动态库
- javascript - Typescript 在某些函数中将 var 读取为空数组,但在其他函数中则不然
- ios - 带有 Swift 的 HealthKit 中用于 HKBloodGlucose 的 HKUnit