使用Winsock C ++的蓝牙连接

问题描述

我目前正在一个项目中,尝试使用蓝牙和Winsock连接两台PC,我的想法是建立它们之间的服务器/客户端连接,并从客户端向服务器发送一个字符串,但不幸的是,它无法正常工作正如我所期望的。

当我运行服务器代码时,它将一直等待客户端请求,并且仅在控制台中显示“ Listen()正常!正在监听连接”。当我运行客户端代码时,它将运行整个代码,直到显示消息“ WSACleanUp()正常工作”。我配对了两台计算机,因为我认为有必要这样做。

我最初的猜测是与服务器的客户端连接不起作用。我是Winsock的新手,我正在努力寻找准确的信息来帮助我解决这些问题(除了以前发布的一些问题和Windows的文档)。

服务器代码

#include<iostream>
#include<WinSock2.h>
#include<ws2bth.h>
#include<bluetoothapis.h>
#include<stdio.h>   
#include<string>
#pragma comment (lib,"ws2_32.lib")

#define DEFAULT_BUFLEN 512
DEFINE_GUID(GUID_NULL,"00000000-0000-0000-0000-000000000000");

using namespace std;

void main()
{
    //INTIALIZE WINSOCK

    WSADATA wsData;
    WORD ver = MAKEWORD(2,2);

    int wsOk = WSAStartup(ver,&wsData);
    if (wsOk != 0)
    {
        cerr << "Can't initialize winsok" << endl;
        return;
    }

    //CREATE A BLUetoOTH SOCKET

    SOCKET server = socket(AF_BTH,SOCK_STREAM,BTHPROTO_RFCOMM);

    if (server == INVALID_SOCKET)
    {
        cerr << "Can't create a socket" << endl;
        return;
    }
    else
    {
        cout << "> Server Socket created" << endl;
    }

    //AUTO ALLOCATION FOR SERVER CHANNEL 

    SOCKADDR_BTH hint;
    memset(&hint,sizeof(hint));
    hint.addressFamily = AF_BTH;
    hint.port = 0;
    hint.btAddr = 0;
    hint.serviceClassId = GUID_NULL;

    //BINDING

    if (bind(server,(sockaddr*)&hint,sizeof(hint)) == SOCKET_ERROR)
    {
        cout << "Bind() Failed with error code: " << WSAGetLastError() << endl;
        closesocket(server);
        return;
    }
    else
    {
        cout << "Bind() is ok" << endl;
        cout << "Waiting for client" << endl;
    }

    //LISTENNING 
    
    if (listen(server,SOMAXCONN) == 0)
    {
        cout << "Listen() is ok! Listening for connection" << endl;

    }
    else
    {
        cout << "Listen() Failed with error code: " << WSAGetLastError() << endl;
        closesocket(server);
        return;
    }

//WAIT FOR CONNECTION

    SOCKADDR_BTH client;
    int clientSize;
    SOCKET clientSocket;

   for (;;)
    {
        clientSize = sizeof(client);
        clientSocket = accept(server,(sockaddr*)&client,&clientSize);
        if (clientSocket == INVALID_SOCKET)
        {
            cout << "Accept() Failed with error code: " << WSAGetLastError() << endl;
            return;
        }
        else
        {
            cout << "Connection accepted" << endl;
            printf("Connection came from %04%08x to channel %d\n",GET_NAP(client.btAddr),GET_SAP(client.btAddr),client.port);
        }

    }
const char *sendbbuf = "Test data from receiver...";
    int recvbuflen = DEFAULT_BUFLEN;
    char recvbuf[DEFAULT_BUFLEN] = "";

    int bytesrec;

    do 
    {
        //ZeroMemory(buf,4096);

        //WAIT FOR CLIENT TO SEND DATA

        bytesrec = recv(clientSocket,recvbuf,recvbuflen,0);
        if (bytesrec > 0)
        {
            cout << " " << bytesrec << " Bytes received" << endl;
        }
        else if (bytesrec == 0)
        {
            cout << "Client disconnected" << endl;
        }
        else
        {
            cout << "recv() Failed with error code: " << WSAGetLastError() << endl;
        }
} while (bytesrec > 0);
//ECHO MESSAGE BACK TO CLIENT

    bytesrec = send(clientSocket,bytesrec,0);
    if (bytesrec == SOCKET_ERROR)
    {
        cout << "Sened() Failed with error: " << WSAGetLastError() << endl;
        closesocket(clientSocket);
        WSACleanup();
        return;
    }
    else
    {
        cout << "Send() is ok" << endl;
        cout << "Bytes sent: " << bytesrec << endl;
    }
    if (closesocket(server) == 0)
    {
        cout << "CloseSocket is ok" << endl;
    }
    if (WSACleanup == 0)
    {
        cout << "WSACleanUp ok" << endl;
    }
    return;
}

客户编码

#include<iostream>
#include<WinSock2.h>
#include<ws2bth.h>
#include<bluetoothapis.h>
#include<stdio.h>   
#include<string.h>
#pragma comment (lib,"ws2_32.lib")

#define DEFAULT_BUFLEN 512


using namespace std;

void main()
{
    //SERVER BLUetoOTH ADRESS

    //BTH_ADDR addr = 0xB0FC3616D3EE;
    
    //INTIALIZE WINSOCK

    WSADATA wsData;
    WORD ver = MAKEWORD(2,&wsData);
    if (wsOk != 0)
    {
        cerr << "Can't initialize winsok" << endl;
        return;
    }

    //CREATE A BLUetoOTH SOCKET

    SOCKET client = socket(AF_BTH,BTHPROTO_RFCOMM);

    if (client == INVALID_SOCKET)
    {
        cerr << "Can't create a socket" << endl;
        WSACleanup();
        return;
    }
    else
    {
        cout << "Socket created" << endl;

    }

    //AUTO ALLOCATION FOR SERVER CHANNEL 

    SOCKADDR_BTH hint;
    memset(&hint,sizeof(hint));
    hint.addressFamily = AF_BTH;
    hint.port = 0;
    hint.btAddr = BTH_ADDR(0xB0FC3616D3EE);
    hint.serviceClassId = HandsfreeServiceClass_UUID;


    int connResult = connect(client,sizeof(hint));
    if (connResult == SOCKET_ERROR)
    {
        cerr << "Can't connect to server,ERR #" << WSAGetLastError() << endl;
        closesocket(client);
        WSACleanup();
        return;
    }
    else
    {
        cout << "Connected" << endl;
    }

    const char *sendbuf = "Test data from client..";
    int recvbuflen = DEFAULT_BUFLEN;
    char recvbuf[DEFAULT_BUFLEN] = "";

    int res = send(client,sendbuf,(int)strlen(sendbuf),MSG_OOB);

    if (res == SOCKET_ERROR)
    {
        cout << "Send() Failed with error code: " << WSAGetLastError() << endl;
        closesocket(client);
        WSACleanup();
        return;
    }
    else
    {
        cout << "Send() is ok" << endl;
        cout << "Bytes sent: " << res << endl;
    }
    res = shutdown(client,SD_SEND);
    if (res == SOCKET_ERROR)
    {
        cout << "Shutdown() Failed with error code: " << WSAGetLastError() << endl;
        closesocket(client);
        WSACleanup();
        return;
    }
    else
    {
        cout << "Shutdown() is working" << endl;
    }

    //RECEIVE DATA

    do
    {
        res = recv(client,0);
        if (res > 0)
        {
            cout << " " << res << " Bytes received from sender" << endl;
        }
        else if (res == 0)
        {
            cout << "Client disconnected" << endl;
        }
        else
        {
            cout << "recv() Failed with code: " << WSAGetLastError() << endl;
        }

    } while (res > 0);

    if (closesocket(client) == 0)
    {
        cout << "CloseSocket() works fine" << endl;
    }
    if (WSACleanup() == 0)
    {
        cout << "WSACleanUp() works fine" << endl;
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)