#c #windows #winapi #bluetooth #winsock2
#c #Windows #winapi #bluetooth #winsock2
Вопрос:
Я пытаюсь создать простое клиентское приложение Windows Bluetooth. Однако после успешного подключения функция 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), amp;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 *) amp;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 successn";
}
// 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;
}
Комментарии:
1. Одна из возможных причин: неправильные данные, поэтому на стороне сервера появляется переполнение буфера, или сервер просто прерывает соединение из-за неправильных данных.
2. Переместите ваши вызовы
WSAGetLastError
сразу после того, как вы определили, что он вернет значимое значение. У вас нет никаких вызовов чередования, которые могли бы его изменить.3. Клиентский код не видит проблемы, пожалуйста, добавьте код сервера в вопрос.