Winsock远程设备发现

时间:2015-08-16 16:52:47

标签: c++ windows winapi bluetooth winsock

我是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;
} 

我需要帮助来解决这个问题

提前感谢您提供任何帮助

1 个答案:

答案 0 :(得分:3)

您的字符编码(潜在)不匹配。这条线

LPTSTR s = pResults->lpszServiceInstanceName;

扩展为

LPWSTR s = pResults->lpszServiceInstanceName;

如果您将项目的字符编码设置为 Unicode (默认设置)。要输出Unicode字符串,您必须使用std::wcout而不是std::cout

LPCWSTR s = pResults->lpszServiceInstanceName;
wcout << s << endl;

为了减少无意中使用意外字符编码的几率,代码应明确指定它使用的字符编码。问题中的代码应使用WSAQUERYSETW,然后调用WSALookupServiceBeginWWSALookupServiceNextW

<小时/> 观察到的行为的解释:

std::coutconst char*解释为C风格的字符串,并在找到NUL字符之前显示字符(请参阅operator<<(std::basic_ostream))。

另一方面,const wchar_t*并不被解释为具有任何特殊意义。 std::cout将其视为任何其他指针,并默认使用十六进制数字系统打印其值(请参阅std::basic_ostream::operator<<)。