gpt4 book ai didi

c++ - connect() 上的蓝牙 winsock 错误 10049

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:02:17 28 4
gpt4 key购买 nike

我正在用 visual-c++ 为客户端应用程序开发一个 dll,以通过蓝牙将我的电脑连接到我的 android 手机。我使用此功能在手机上查找我的蓝牙服务(请参阅注释代码!):

bool BlueRayXVR::findPairedService(GUID* guid, _SOCKET_ADDRESS* ret){
this->checkStartup();

HBLUETOOTH_DEVICE_FIND found_devices;

BLUETOOTH_DEVICE_INFO device_info;
device_info.dwSize = sizeof(device_info);

BLUETOOTH_DEVICE_SEARCH_PARAMS search_criteria;
search_criteria.dwSize = sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS);
search_criteria.fReturnAuthenticated = TRUE;
search_criteria.fReturnRemembered = FALSE;
search_criteria.fReturnConnected = FALSE;
search_criteria.fReturnUnknown = FALSE;
search_criteria.fIssueInquiry = FALSE;
search_criteria.cTimeoutMultiplier = 0;

found_devices = BluetoothFindFirstDevice(&search_criteria, &device_info);

if (found_devices == NULL)
{
_tprintf(TEXT("Error: \n%s\n"), getErrorMessage(WSAGetLastError(), error));
return false;
}

WSAQUERYSET querySet;
memset(&querySet, 0, sizeof(querySet));
querySet.dwSize = sizeof(querySet);
querySet.lpServiceClassId = guid;
querySet.dwNameSpace = NS_BTH;

SOCKADDR_BTH sab;
memset (&sab, 0, sizeof(sab));
sab.addressFamily = AF_BTH;

char addressAsString[1000];
DWORD addressSize = sizeof(addressAsString);

bool found = false;

do
{
sab.btAddr = device_info.Address.ullLong;
if (0 != WSAAddressToString((LPSOCKADDR)&sab, sizeof(sab), NULL, (LPWSTR)addressAsString, &addressSize)){
_tprintf(TEXT("Error get the mac of the device %s\n.Going to the next device."), device_info.szName);
}
else{
_tprintf(TEXT("Check on device %s%s for the service.\n"), device_info.szName, addressAsString);
querySet.lpszContext =(LPWSTR) addressAsString;
HANDLE service_lookup_handle;
DWORD flags = LUP_FLUSHCACHE |LUP_RETURN_NAME | LUP_RETURN_ADDR | LUP_RETURN_BLOB;

int result = WSALookupServiceBegin(&querySet, flags, &service_lookup_handle);

if (0 == result)
{
BYTE buffer[2000];
DWORD bufferLength = sizeof(buffer);
WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer;
if(0 == WSALookupServiceNext(service_lookup_handle, flags, &bufferLength, pResults))
{
_tprintf(TEXT("Service : %s\n"), pResults->lpszServiceInstanceName);
_tprintf(TEXT("Comment : %s\n"), pResults->lpszComment);
*ret = pResults->lpcsaBuffer->RemoteAddr;
found = true;

/* this->sock = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
if (0 == ::connect(sock, ret->lpSockaddr, ret->iSockaddrLength))
{
printf("connected");
//closesocket (*sock);
//return TRUE;
}
wprintf(L"errore %d: %s", WSAGetLastError(), this->getErrorMessage(WSAGetLastError(), this->error));
*/
}
result = WSALookupServiceEnd(service_lookup_handle);
}
else
_tprintf(TEXT("%s\nGoing to the next device..\n"), getErrorMessage(GetLastError(), error));
}
} while (BluetoothFindNextDevice(found_devices, &device_info) && !found);

if(found_devices)
BluetoothFindDeviceClose(found_devices);

_tprintf(TEXT("No more device.\n"));
return found;
}

这个连接到手机:

bool BlueRayXVR::connect(_SOCKET_ADDRESS* host)
{
this->sock = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
if (this->sock == INVALID_SOCKET)
{
_tprintf(TEXT("Failed to get bluetooth socket! %s\n"), getErrorMessage(WSAGetLastError(), error));
exit(1);
}

if (0 == ::connect(sock, host->lpSockaddr, host->iSockaddrLength))
{
printf("connected\n");
return TRUE;
}
wprintf(L"errore %d: %s", WSAGetLastError(), this->getErrorMessage(WSAGetLastError(), this->error));
return FALSE;
}

在我的测试控制台应用程序中我这样做:

       _SOCKET_ADDRESS address;
memset (&address, 0, sizeof(address));
if(blue->findPairedService(&blue->getDefaultGUID4XVR(), &address)){
printf("service founded..try to connect..\n");
if(blue->connect(&address))
blue->read();
}

问题是,如果我运行我的代码,我总是会收到错误 10049。

奇怪的是,如果我取消注释 findPairedService 函数中的代码行,我就这样做了

       _SOCKET_ADDRESS address;
memset (&address, 0, sizeof(address));
if(blue->findPairedService(&blue->getDefaultGUID4XVR(), &address)){

它成功连接到手机....

怎么了??

谢谢!

最佳答案

根据文档,WSALookupServiceEnd“终止查询并清理上下文。”据推测,这包括删除/覆盖它返回的 SOCKADDR 结构中的值,稍后您将在连接调用中使用这些值。因此,只需创建您自己的内存位来存储结构,将返回的字节复制到其中,一切都应该没问题。

顺便说一句,你知道 Windows 会自动执行任何必要的 SDP 查找吗?当在 SOCKADDR_BTH.serviceClassId 字段中为 connect() 提供服务类 ID (UUID/Guid) 时,它将执行 SDP 查找并找到 RFCOMM 端口号——并且您不再需要做任何这些事情。 :-)

关于c++ - connect() 上的蓝牙 winsock 错误 10049,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2859029/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com