简体   繁体   中英

Winsock remote device discovery

I am new to winsock and I wish to use bluetooth for my project.

I wrote a simple code taking help from online resources to find remote devices

It should print the name of the remote devices but instead it prints some hex value I think...I dont know what that is

The code is

#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;
} 

I require help in solving this issue

Thanks in advance for any help

You have a (potential) mismatch of character encodings. The line

LPTSTR s = pResults->lpszServiceInstanceName;

expands to

LPWSTR s = pResults->lpszServiceInstanceName;

if you have your project's character encoding set to Unicode (default setting). To output a Unicode string, you have to use std::wcout instead of std::cout :

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

To reduce the odds of inadvertently using an unexpected character encoding, code should explicitly specify the character encoding it uses. The code in the question should use WSAQUERYSETW , and call WSALookupServiceBeginW and WSALookupServiceNextW instead.


Explanation of the observed behavior:

std::cout interprets a const char* as a C-style string, and displays the characters until it finds a NUL character (see operator<<(std::basic_ostream) ).

A const wchar_t* , on the other hand, is not interpreted to mean anything special. std::cout treats it like any other pointer, and prints its value using the hexadecimal numeral system by default (see std::basic_ostream::operator<< ).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM