Winsock 远程设备发现
Winsock remote device discovery
我是 winsock 的新手,我希望在我的项目中使用蓝牙。
我借助在线资源编写了一个简单的代码来查找远程设备
它应该打印远程设备的名称,但它打印了一些我认为的十六进制值...我不知道那是什么
密码是
#include "stdafx.h"
#include<iostream>
#include<winsock2.h>
#include<ws2bth.h>
#include<bluetoothapis.h>
#include<stdlib.h>
using namespace std;
#define SUCCESS 0
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "irprops.lib")
int main()
{
WSADATA data;
int result;
result = WSAStartup(MAKEWORD(2, 2), &data);
if (result != SUCCESS)
{
cout << "error occured while initialising winsock...";
exit(result);
}
cout << "winsock initialisation successful\n";
WSAQUERYSET queryset;
memset(&queryset, 0, sizeof(WSAQUERYSET));
queryset.dwSize = sizeof(WSAQUERYSET);
queryset.dwNameSpace = NS_BTH;
HANDLE hLookup;
result = WSALookupServiceBegin(&queryset, LUP_CONTAINERS, &hLookup);
if (result != SUCCESS)
{
cout << "error in initialising look up service\n";
exit(result);
}
cout << "initialising lookup service successful\n";
BYTE buffer[4096];
memset(buffer, 0, sizeof(buffer));
DWORD bufferLength = sizeof(buffer);
WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer;
while (result == SUCCESS)
{
result = WSALookupServiceNext(hLookup, LUP_RETURN_NAME | LUP_CONTAINERS | LUP_RETURN_ADDR | LUP_FLUSHCACHE | LUP_RETURN_TYPE | LUP_RETURN_BLOB | LUP_RES_SERVICE, &bufferLength, pResults);
if (result == SUCCESS)
{
//DEVICE FOUND
LPTSTR s = pResults->lpszServiceInstanceName;
cout << s << endl;
Sleep(1000);
}
}
WSALookupServiceEnd(hLookup);
return 0;
}
我需要帮助解决这个问题
在此先感谢您的帮助
您的字符编码(可能)不匹配。行
LPTSTR s = pResults->lpszServiceInstanceName;
扩展到
LPWSTR s = pResults->lpszServiceInstanceName;
如果您将项目的字符编码设置为 Unicode(默认设置)。要输出 Unicode 字符串,您必须使用 std::wcout 而不是 std::cout
:
LPCWSTR s = pResults->lpszServiceInstanceName;
wcout << s << endl;
为了减少无意中使用意外字符编码的几率,代码应明确指定它使用的字符编码。问题中的代码应该使用 WSAQUERYSETW
,并改为调用 WSALookupServiceBeginW
和 WSALookupServiceNextW
。
观察到的行为的解释:
std::cout
将 const char*
解释为 C 风格的字符串,并显示字符直到找到 NUL
字符(参见 operator<<(std::basic_ostream))。
另一方面,A const wchar_t*
不会被解释为有任何特殊意义。 std::cout
将其视为任何其他指针,并默认使用十六进制数字系统打印其值(请参阅 std::basic_ostream::operator<<)。
我是 winsock 的新手,我希望在我的项目中使用蓝牙。
我借助在线资源编写了一个简单的代码来查找远程设备
它应该打印远程设备的名称,但它打印了一些我认为的十六进制值...我不知道那是什么
密码是
#include "stdafx.h"
#include<iostream>
#include<winsock2.h>
#include<ws2bth.h>
#include<bluetoothapis.h>
#include<stdlib.h>
using namespace std;
#define SUCCESS 0
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "irprops.lib")
int main()
{
WSADATA data;
int result;
result = WSAStartup(MAKEWORD(2, 2), &data);
if (result != SUCCESS)
{
cout << "error occured while initialising winsock...";
exit(result);
}
cout << "winsock initialisation successful\n";
WSAQUERYSET queryset;
memset(&queryset, 0, sizeof(WSAQUERYSET));
queryset.dwSize = sizeof(WSAQUERYSET);
queryset.dwNameSpace = NS_BTH;
HANDLE hLookup;
result = WSALookupServiceBegin(&queryset, LUP_CONTAINERS, &hLookup);
if (result != SUCCESS)
{
cout << "error in initialising look up service\n";
exit(result);
}
cout << "initialising lookup service successful\n";
BYTE buffer[4096];
memset(buffer, 0, sizeof(buffer));
DWORD bufferLength = sizeof(buffer);
WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer;
while (result == SUCCESS)
{
result = WSALookupServiceNext(hLookup, LUP_RETURN_NAME | LUP_CONTAINERS | LUP_RETURN_ADDR | LUP_FLUSHCACHE | LUP_RETURN_TYPE | LUP_RETURN_BLOB | LUP_RES_SERVICE, &bufferLength, pResults);
if (result == SUCCESS)
{
//DEVICE FOUND
LPTSTR s = pResults->lpszServiceInstanceName;
cout << s << endl;
Sleep(1000);
}
}
WSALookupServiceEnd(hLookup);
return 0;
}
我需要帮助解决这个问题
在此先感谢您的帮助
您的字符编码(可能)不匹配。行
LPTSTR s = pResults->lpszServiceInstanceName;
扩展到
LPWSTR s = pResults->lpszServiceInstanceName;
如果您将项目的字符编码设置为 Unicode(默认设置)。要输出 Unicode 字符串,您必须使用 std::wcout 而不是 std::cout
:
LPCWSTR s = pResults->lpszServiceInstanceName;
wcout << s << endl;
为了减少无意中使用意外字符编码的几率,代码应明确指定它使用的字符编码。问题中的代码应该使用 WSAQUERYSETW
,并改为调用 WSALookupServiceBeginW
和 WSALookupServiceNextW
。
观察到的行为的解释:
std::cout
将 const char*
解释为 C 风格的字符串,并显示字符直到找到 NUL
字符(参见 operator<<(std::basic_ostream))。
A const wchar_t*
不会被解释为有任何特殊意义。 std::cout
将其视为任何其他指针,并默认使用十六进制数字系统打印其值(请参阅 std::basic_ostream::operator<<)。