2015-08-16 5 views
0

Я новичок в winsock, и я хочу использовать bluetooth для своего проекта.Открытие удаленных устройств 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; 
} 

мне нужна помощь в решении этого вопроса

заранее спасибо за любую помощь

ответ

2

У вас есть (потенциальное) несоответствие кодировок символов. Линия

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<<).

+0

Спасибо большое ... –

+0

Теперь я не могу распечатать адрес Bluetooth ......... Я использую .... BTH_ADDR b = ((SOCKADDR_BTH *) pResults-> lpcsaBuffer-> RemoteAddr.lpSockaddr) -> btAddr; ............. а затем я печатаю b, используя wcout ... но я не получаю адрес ..... Как я могу его исправить? ?? –

+0

@DebeshMohanty: Определение для 'BTH_ADDR' -' typedef ULONGLONG BTH_ADDR; '(см. * Bluetoothapis.h *). Начиная с C++ 11, 'std :: wcout' может выводить значения' unsigned long long'. Чтобы сделать это более читаемым, вы можете использовать шестнадцатеричную систему цифр: 'std :: wcout << std :: hex << b;'. Если вам нужно дополнительное форматирование, вы должны [задать новый вопрос] (http://stackoverflow.com/questions/ask). – IInspectable

Смежные вопросы