Winsock Bluetooth последующие вызовы функции отправки завершаются с ошибкой WSAECONNABORTED

#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. Клиентский код не видит проблемы, пожалуйста, добавьте код сервера в вопрос.