如何解决使用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 举报,一经查实,本站将立刻删除。