-
August 29th, 2011, 12:59 PM
#1
Bluetooth socket not receiving data sent from client.
HI,
I'm using windows 7 , 64 bit os, and had written bluetooth server program running on this pc.
This server will accept connections from clients , and display the text sent by clients.
My issue is , Bluetooth server running on PC, is not receiving data sent from clients, but connection establishment is successful.
What I mean is, after executing "recv(s2,(char*)buffer, sizeof(buffer), 0);" function call, the server is blocked indefinitely.
Please let me know how this issue could be resolved.
#include "stdafx.h"
#include <WinSock2.h>
#include <ws2bth.h>
#include <bthsdpdef.h>
#include <BluetoothAPIs.h>
#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "irprops.lib")
TCHAR *GetLastErrorMessage(DWORD last_error)
{
static TCHAR errmsg[512];
if (!FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
0,
last_error,
0,
errmsg,
511,
NULL))
{
/* if we fail, call ourself to find out why and return that error */
return (GetLastErrorMessage(GetLastError()));
}
return errmsg;
}
int _tmain(int argc, _TCHAR* argv[])
{
WORD wVersionRequested = 0x202;
WSADATA m_data;
if (0 == WSAStartup(wVersionRequested, &m_data))
{
SOCKET s = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
const DWORD lastError = ::GetLastError();
if (s == INVALID_SOCKET)
{
printf("Failed to get bluetooth socket! %s\n", GetLastErrorMessage(lastError));
exit(1);
}
WSAPROTOCOL_INFO protocolInfo;
int protocolInfoSize = sizeof(protocolInfo);
if (0 != getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFO, (char*)&protocolInfo, &protocolInfoSize))
{
exit(1);
}
SOCKADDR_BTH address;
address.addressFamily = AF_BTH;
address.btAddr = 0;
address.serviceClassId = GUID_NULL;
address.port = BT_PORT_ANY;
sockaddr *pAddr = (sockaddr*)&address;
if (0 != bind(s, pAddr, sizeof(SOCKADDR_BTH)))
{
printf("%s\n", GetLastErrorMessage(GetLastError()));
}
else
{
printf("\nBinding Successful....\n");
int length = sizeof(SOCKADDR_BTH) ;
getsockname(s,(sockaddr*)&address,&length);
wprintf (L"Local Bluetooth device is %04x%08x \nServer channel = %d\n", GET_NAP(address.btAddr), GET_SAP(address.btAddr), address.port);
}
int size = sizeof(SOCKADDR_BTH);
if (0 != getsockname(s, pAddr, &size))
{
printf("%s\n", GetLastErrorMessage(GetLastError()));
}
if (0 != listen(s, 10))
{
printf("%s\n", GetLastErrorMessage(GetLastError()));
}
WSAQUERYSET service;
memset(&service, 0, sizeof(service));
service.dwSize = sizeof(service);
service.lpszServiceInstanceName = _T("Accelerometer Data...");
service.lpszComment = _T("Pushing data to PC");
GUID serviceID = OBEXFileTransferServiceClass_UUID;
service.lpServiceClassId = &serviceID;
service.dwNumberOfCsAddrs = 1;
service.dwNameSpace = NS_BTH;
CSADDR_INFO csAddr;
memset(&csAddr, 0, sizeof(csAddr));
csAddr.LocalAddr.iSockaddrLength = sizeof(SOCKADDR_BTH);
csAddr.LocalAddr.lpSockaddr = pAddr;
csAddr.iSocketType = SOCK_STREAM;
csAddr.iProtocol = BTHPROTO_RFCOMM;
service.lpcsaBuffer = &csAddr;
if (0 != WSASetService(&service, RNRSERVICE_REGISTER, 0))
{
printf("Service registration failed....");
printf("%d\n", GetLastErrorMessage(GetLastError()));
}
else
{
printf("\nService registration Successful....\n");
}
printf("\nBefore accept.........");
SOCKADDR_BTH sab2;
int ilen = sizeof(sab2);
SOCKET s2 = accept (s,(sockaddr*)&sab2, &ilen);
if (s2 == INVALID_SOCKET)
{
wprintf (L"Socket bind, error %d\n", WSAGetLastError ());
}
wprintf (L"\nConnection came from %04x%08x to channel %d\n",
GET_NAP(sab2.btAddr), GET_SAP(sab2.btAddr), sab2.port);
wprintf (L"\nAfter Accept\n");
unsigned char buffer[2000];
while(1)
{
memset(buffer, 0, sizeof(buffer));
int r = recv(s2,(char*)buffer, sizeof(buffer), 0);
printf("Error = %d\n",WSAGetLastError() /*GetLastErrorMessage(GetLastError())*/);
wprintf(L"Received : %s\n",buffer);
Sleep(500);
}
//SpinConnectionThreadsOnSocket (s2);
closesocket(s2);
if (0 != WSASetService(&service, RNRSERVICE_DELETE, 0))
{
printf("%s\n", GetLastErrorMessage(GetLastError()));
}
closesocket(s);
WSACleanup();
}
return 0 ;
}
Here is the snapshot, where you can see server is waiting, (executing recv())
http://dl.dropbox.com/u/37131873/Pics/6675.jpg
Thanks in advance.
Regards,
Vijay.
-
August 30th, 2011, 03:56 AM
#2
Re: Bluetooth socket not receiving data sent from client.
Dear Vijay,
please edit your post adding Code tags around code snippet(s) and attach "the snapshot" to the post.
Victor Nijegorodov
-
August 30th, 2011, 03:07 PM
#3
Re: Bluetooth socket not receiving data sent from client.
Agreement with VictorN about the need to edit your post.
In addition:
Originally Posted by VijayDandur
My issue is , Bluetooth server running on PC, is not receiving data sent from clients, but connection establishment is successful.
What I mean is, after executing "recv(s2,(char*)buffer, sizeof(buffer), 0);" function call, the server is blocked indefinitely.
How have you confirmed that the client is indeed sending data? The behavior you are seeing on the server side is completely consistent with a non-communicative client who, after establishing a connection, has not bothered to send any data.
So, please explain how you have confirmed that the client is sending something.
Perhaps post the client code, but I have a suspicion that (as in your other post) you have not written any client code but are instead relying on some "built-in" behavior of the client (a phone, I think).
Mike
Tags for this Thread
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|