您没有在socket() 之前调用WSAStartup()。如果您一直在进行更好的错误检查,您会更快地意识到这一点。见Handling Winsock Errors。
socket() 将返回 INVALID_SOCKET (-1),然后 WSAGetLastError() 将返回 WSANOTINITIALISED (10093)。
成功的WSAStartup尚未执行。
应用程序未调用 WSAStartup 或 WSAStartup 失败。应用程序可能正在访问当前活动任务不拥有的套接字(即尝试在任务之间共享套接字),或者 WSACleanup 已被调用太多次。
然后connect() 会以SOCKET_ERROR (-1) 失败,WSAGetLastError() 会返回WSAENOTSOCK (10038)。
非套接字上的套接字操作。
试图对不是套接字的东西进行操作。套接字句柄参数没有引用有效的套接字,或者对于 select,fd_set 的成员无效。
根据Bluetooth Programming with Windows Sockets 文档:
与所有 Windows Sockets 应用程序编程一样,必须调用 WSAStartup 函数来启动 Windows Sockets 功能并启用蓝牙。
始终检查系统调用的错误代码!
试试这样的:
#include <winsock2.h>
#include <ws2bth.h>
#include <Windows.h>
#include <iostream>
#include <cstdio>
#pragma comment(lib, "Ws2_32.lib")
int str2ba(const char *straddr, BTH_ADDR *btaddr)
{
int i;
unsigned int aaddr[6];
BTH_ADDR tmpaddr = 0;
if (std::sscanf(straddr, "%02x:%02x:%02x:%02x:%02x:%02x",
&aaddr[0], &aaddr[1], &aaddr[2],
&aaddr[3], &aaddr[4], &aaddr[5]) != 6)
return 1;
*btaddr = 0;
for (i = 0; i < 6; i++) {
tmpaddr = (BTH_ADDR) (aaddr[i] & 0xff);
*btaddr = ((*btaddr) << 8) + tmpaddr;
}
return 0;
}
int main() {
WSADATA wsa;
memset(&wsa, 0, sizeof(wsa));
int error = WSAStartup(MAKEWORD(2,2), &wsa);
if (error != 0) {
std::cerr << "WSAStartup() failed, error: " << error;
return -1;
}
SOCKET btSocket = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
if (btSocket == INVALID_SOCKET) {
error = WSAGetLastError();
std::cerr << "socket() failed, error: " << error;
WSACleanup();
return -1;
}
SOCKADDR_BTH sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr));
sockAddr.addressFamily = AF_BTH;
sockAddr.serviceClassId = RFCOMM_PROTOCOL_UUID;
sockAddr.port = BT_PORT_ANY;
str2ba("7C:9E:BD:4C:BF:B2", &sockAddr.btAddr);
if (connect(btSocket, (SOCKADDR*)&sockAddr, sizeof(sockAddr)) == SOCKET_ERROR) {
error = WSAGetLastError();
std::cerr << "connect() failed, error: " << error;
closesocket(btSocket);
WSACleanup();
return -1;
}
// use btSocket as needed...
closesocket(btSocket);
return 0;
}