📄 opttest.cxx
字号:
continue;
} else {
wprintf (L"Incorrect syntax: %s\n", argv[0]);
return FALSE;
}
int iRes = setsockopt (s, SOL_RFCOMM, iName, (char *)&iOpt, sizeof(iOpt));
if (iRes != ERROR_SUCCESS) {
wprintf (L"setsockopt returns %d for %s (name = %d, val = %d)\n", iRes, argv[0], iName, iOpt);
return FALSE;
}
++argv;
--argc;
if (sz != NULL) {
++argv;
--argc;
}
}
return TRUE;
}
int wmain (int argc, WCHAR **argv) {
BT_ADDR b;
unsigned int channel = 0;
WCHAR *arg2 = argv[2];
WCHAR *arg3 = argv[3];
WCHAR *arg4 = argv[4];
WSADATA wsd;
if (WSAStartup (MAKEWORD(1,0), &wsd)) {
wprintf (L"Initialization of socket subsystem failed! Error = %d\n", WSAGetLastError ());
return 0;
}
if ((argc == 2) && (wcsicmp (argv[1], L"manage") == 0)) {
SOCKET s = socket (AF_BT, SOCK_STREAM, BTHPROTO_RFCOMM);
for ( ; ; ) {
wprintf (L"Management mode. Type 'exit' to exit, 'help' for command list\n> ");
WCHAR szCommand[BUF_MAX];
if (! fgetws (szCommand, BUF_MAX, stdin))
break;
WCHAR *szEOL = wcschr (szCommand, L'\n');
if (szEOL)
*szEOL = '\0';
if (wcsicmp (szCommand, L"EXIT") == 0)
break;
if (wcsicmp (szCommand, L"HELP") == 0) {
wprintf (L"EXIT - exit the monitor\n");
wprintf (L"GETVERSIONS - get local version\n");
wprintf (L"GETPAGE, GETCOD, GETSCAN, GETAUTH - retrieve card parameters\n");
wprintf (L"SETCOD 0xhhhhhh, SETPAGE 0xhhhh, SETSCAN 0xhh, SETAUTH 0xhh - set card parameters\n");
wprintf (L"GETNAME hhhhhhhhhhhh - get remote name\n");
continue;
}
if (wcsicmp (szCommand, L"GETVERSION") == 0) {
BTH_LOCAL_VERSION bv;
int iRes;
int ilen = sizeof(bv);
iRes = getsockopt (s, SOL_RFCOMM, SO_BTH_GET_LOCAL_VER, (char *)&bv, &ilen);
if (iRes)
wprintf (L"SO_BTH_GET_LOCAL_VER : error %d\n", iRes);
else {
wprintf (L"hci version %d\n", bv.hci_version);
wprintf (L"hci revision %d\n", bv.hci_revision);
wprintf (L"lmp version %d\n", bv.lmp_version);
wprintf (L"lmp revision %d\n", bv.lmp_subversion);
wprintf (L"manufacturer: ");
switch (bv.manufacturer) {
case 0:
wprintf (L"Ericsson\n");
break;
case 1:
wprintf (L"Nokia\n");
break;
case 2:
wprintf (L"Intel\n");
break;
case 3:
wprintf (L"IBM\n");
break;
case 4:
wprintf (L"Toshiba\n");
break;
case 5:
wprintf (L"3COM\n");
break;
case 6:
wprintf (L"Microsoft\n");
break;
case 7:
wprintf (L"Lucent\n");
break;
case 8:
wprintf (L"Motorola\n");
break;
case 9:
wprintf (L"Infineon\n");
break;
case 10:
wprintf (L"CSR\n");
break;
case 11:
wprintf (L"Silicon Wave\n");
break;
case 12:
wprintf (L"Digianswer\n");
break;
default:
wprintf (L"Unknown, code %d\n", bv.manufacturer);
break;
}
DumpFeatures (bv.lmp_features);
}
continue;
}
if (wcsicmp (szCommand, L"GETPAGE") == 0) {
int iDatum;
int iRes;
int ilen = sizeof(iDatum);
iRes = getsockopt (s, SOL_RFCOMM, SO_BTH_GET_PAGE_TO, (char *)&iDatum, &ilen);
if (iRes)
wprintf (L"SO_BTH_GET_PAGE_TO : error %d\n", iRes);
else
wprintf (L"SO_BTH_GET_PAGE_TO returns 0x%08x (%d)\n", iDatum, iDatum);
continue;
}
if (wcsicmp (szCommand, L"GETCOD") == 0) {
int iDatum;
int iRes;
int ilen = sizeof(iDatum);
iRes = getsockopt (s, SOL_RFCOMM, SO_BTH_GET_COD, (char *)&iDatum, &ilen);
if (iRes)
wprintf (L"SO_BTH_GET_COD : error %d\n", iRes);
else
wprintf (L"SO_BTH_GET_COD returns 0x%08x (%d)\n", iDatum, iDatum);
continue;
}
if (wcsicmp (szCommand, L"GETSCAN") == 0) {
int iDatum;
int iRes;
int ilen = sizeof(iDatum);
iRes = getsockopt (s, SOL_RFCOMM, SO_BTH_GET_SCAN, (char *)&iDatum, &ilen);
if (iRes)
wprintf (L"SO_BTH_GET_SCAN : error %d\n", iRes);
else
wprintf (L"SO_BTH_GET_SCAN returns 0x%08x (%d)\n", iDatum, iDatum);
continue;
}
if (wcsicmp (szCommand, L"GETAUTH") == 0) {
int iDatum;
int iRes;
int ilen = sizeof(iDatum);
iRes = getsockopt (s, SOL_RFCOMM, SO_BTH_GET_AUTHN_ENABLE, (char *)&iDatum, &ilen);
if (iRes)
wprintf (L"SO_BTH_GET_AUTHN_ENABLE : error %d\n", iRes);
else
wprintf (L"SO_BTH_GET_AUTHN_ENABLE returns 0x%08x (%d)\n", iDatum, iDatum);
continue;
}
if (wcsnicmp (szCommand, L"SETSCAN ", 8) == 0) {
int iDatum = 0;
int iRes;
int ilen = sizeof(iDatum);
WCHAR *p = szCommand + 8;
if (! GetUx (&p, &iDatum, 2)) {
wprintf (L"Syntax: expected hex number, 0xhh\n");
continue;
}
iRes = setsockopt (s, SOL_RFCOMM, SO_BTH_SET_SCAN, (char *)&iDatum, ilen);
if (iRes)
wprintf (L"SO_BTH_SET_SCAN : error %d\n", iRes);
continue;
}
if (wcsnicmp (szCommand, L"SETAUTH ", 8) == 0) {
int iDatum = 0;
int iRes;
int ilen = sizeof(iDatum);
WCHAR *p = szCommand + 8;
if (! GetUx (&p, &iDatum, 2)) {
wprintf (L"Syntax: expected hex number, 0xhh\n");
continue;
}
iRes = setsockopt (s, SOL_RFCOMM, SO_BTH_SET_AUTHN_ENABLE, (char *)&iDatum, ilen);
if (iRes)
wprintf (L"SO_BTH_SET_AUTHN_ENABLE : error %d\n", iRes);
continue;
}
if (wcsnicmp (szCommand, L"SETPAGE ", 8) == 0) {
int iDatum = 0;
int iRes;
int ilen = sizeof(iDatum);
WCHAR *p = szCommand + 8;
if (! GetUx (&p, &iDatum, 4)) {
wprintf (L"Syntax: expected hex number, 0xhhhh\n");
continue;
}
iRes = setsockopt (s, SOL_RFCOMM, SO_BTH_SET_PAGE_TO, (char *)&iDatum, ilen);
if (iRes)
wprintf (L"SO_BTH_SET_PAGE_TO : error %d\n", iRes);
continue;
}
if (wcsnicmp (szCommand, L"SETCOD ", 7) == 0) {
int iDatum = 0;
int iRes;
int ilen = sizeof(iDatum);
WCHAR *p = szCommand + 7;
if (! GetUx (&p, &iDatum, 8)) {
wprintf (L"Syntax: expected hex number, 0xhhhhhh\n");
continue;
}
iRes = setsockopt (s, SOL_RFCOMM, SO_BTH_SET_COD, (char *)&iDatum, ilen);
if (iRes)
wprintf (L"SO_BTH_SET_COD : error %d\n", iRes);
continue;
}
if (wcsnicmp (szCommand, L"GETNAME ", 8) == 0) {
WCHAR *p = szCommand + 8;
BTH_REMOTE_NAME r;
if (! GetBA (&p, &r.bt)) {
wprintf (L"Syntax: expected bluetooth address\n");
continue;
}
int ilen = sizeof(r);
int iRes = setsockopt (s, SOL_RFCOMM, SO_BTH_SET_READ_REMOTE_NAME, (char *)&r, ilen);
if (iRes)
wprintf (L"SO_BTH_SET_READ_REMOTE_NAME : error %d\n", iRes);
else
wprintf (L"Name: %s\n", r.szNameBuffer);
continue;
}
}
closesocket (s);
return 0;
}
if ((argc >= 4) && (wcsicmp (argv[1], L"client") == 0) && GetBA(&arg2, &b)) {
SOCKET s = socket (AF_BT, SOCK_STREAM, BTHPROTO_RFCOMM);
if (s == INVALID_SOCKET) {
wprintf (L"socket failed, error %d\n", WSAGetLastError ());
return 0;
}
if (! ProcessSockOpts (s, argv + 4, argc - 4)) {
closesocket(s);
return 0;
}
SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.addressFamily = AF_BT;
sa.btAddr = b;
if (! GetDI(&arg3, &channel)) {
wprintf(L"Invalid format for Channel specified\n");
closesocket(s);
return 0;
}
sa.port = channel & 0xff;
wprintf (L"Connecting to %04x%08x 0x%02x\n", GET_NAP(b), GET_SAP(b), channel & 0xff);
if (connect (s, (SOCKADDR *)&sa, sizeof(sa))) {
wprintf (L"Connect failed, error = %d\n", WSAGetLastError ());
return 0;
}
SOCKADDR_BTH sa3;
int namelen = sizeof(sa3);
if (0 == getsockname(s, (SOCKADDR *)&sa3, &namelen)) {
wprintf (L"Socket s:localname<%04x%08x> connecting on port %d(0x%x)...\n", GET_NAP(sa3.btAddr), GET_SAP(sa3.btAddr), sa3.port, sa3.port);
}
namelen = sizeof(sa3);
if (0 == getpeername(s, (SOCKADDR *)&sa3, &namelen)) {
wprintf (L"Socket s:peername<%04x%08x> connecting on port %d(0x%x)...\n", GET_NAP(sa3.btAddr), GET_SAP(sa3.btAddr), sa3.port, sa3.port);
}
wprintf (L"Established connection with %04x%08x 0x%02x\n", GET_NAP(b), GET_SAP(b), channel & 0xff);
CloseHandle (CreateThread(NULL, 0, ReadThread, (LPVOID)s, 0, NULL));
WriteThread ((LPVOID)s);
} else if ((argc >= 3) && (wcsicmp (argv[1], L"server") == 0)) {
SOCKET s = socket (AF_BT, SOCK_STREAM, BTHPROTO_RFCOMM);
if (s == INVALID_SOCKET) {
wprintf (L"socket failed, error %d\n", WSAGetLastError ());
return 0;
}
SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.addressFamily = AF_BT;
if (! GetDI (&arg2, &channel)) {
wprintf(L"Invalid format for Channel specified\n");
closesocket(s);
return 0;
}
sa.port = channel & 0xff;
wprintf (L"binding to 0x%02x\n", channel & 0xff);
if (bind (s, (SOCKADDR *)&sa, sizeof(sa))) {
wprintf (L"Bind failed, error = %d\n", WSAGetLastError ());
closesocket(s);
return 0;
}
int namelen = sizeof(sa);
if (getsockname(s, (SOCKADDR *)&sa, &namelen)) {
wprintf(L"getsockname failed, error = %d\n", WSAGetLastError());
closesocket(s);
return 0;
}
if (! ProcessSockOpts (s, argv + 3, argc - 3)) {
closesocket(s);
return 0;
}
wprintf (L"localhost<%04x%08x> listening on port %d(0x%x)...\n", GET_NAP(sa.btAddr), GET_SAP(sa.btAddr), sa.port, sa.port);
if (listen (s, 5)) {
wprintf (L"Listen failed, error = %d\n", WSAGetLastError ());
return 0;
}
for ( ; ; ) {
SOCKADDR_BTH sa2;
int size = sizeof(sa2);
wprintf (L"Accepting...\n");
SOCKET s2 = accept (s, (SOCKADDR *)&sa2, &size);
if (s2 == INVALID_SOCKET) {
wprintf (L"Accept failed, error = %d\n", WSAGetLastError ());
break;
}
if (size != sizeof(sa2))
wprintf (L"Sockaddr size is %d, not %d which was expected!\n", size, sizeof(sa2));
BT_ADDR b2 = sa2.btAddr;
int channel2 = sa2.port;
SOCKADDR_BTH sa3;
namelen = sizeof(sa3);
if (0 == getsockname(s2, (SOCKADDR *)&sa3, &namelen)) {
wprintf (L"Socket s2:localname<%04x%08x> connecting on port %d(0x%x)...\n", GET_NAP(sa3.btAddr), GET_SAP(sa3.btAddr), sa3.port, sa3.port);
}
namelen = sizeof(sa3);
if (0 == getpeername(s2, (SOCKADDR *)&sa3, &namelen)) {
wprintf (L"Socket s2:peername<%04x%08x> connecting on port %d(0x%x)...\n", GET_NAP(sa3.btAddr), GET_SAP(sa3.btAddr), sa3.port, sa3.port);
}
wprintf (L"Connection accepted. Family %d Address %04x%08x Channel 0x%02x\n", sa2.addressFamily, GET_NAP(b2), GET_SAP(b2), channel2);
CloseHandle (CreateThread(NULL, 0, ReadThread, (LPVOID)s2, 0, NULL));
CloseHandle (CreateThread(NULL, 0, WriteThread, (LPVOID)s2, 0, NULL));
}
} else {
wprintf (L"Usage: %s {server | client <target bt_addr>} channel {AUTH} {ENCRYPT}\n", argv[0]);
wprintf (L"\t\t{MTU dec. number} {MTUMIN dec. number} {MTUMAX dec. number}\n");
wprintf (L"\t\t{XON dec. number} {XOFF dec. number}\n");
wprintf (L"\t\t{SENDBUFF dec. number} {RECVBUFF dec. number}\n");
wprintf (L"Or: %s manage\n", argv[0]);
return 1;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -