Go Back   Velocity Reviews > Newsgroups > Wireless Networking
User Name
Password
Register FAQ Members List Calendar Search Today's Posts Mark Forums Read

Reply

Wireless Networking - WSASetService() is returning 10022

 
Thread Tools Search this Thread
Old 04-22-2009, 11:12 AM   #1
Default WSASetService() is returning 10022


hi all,

I am trying to publish the OBEX object push Service record using
WSASetService(). But the function is failing with the error code 10022.
Without service record i could able to register. But my PDA device is not
dectecting my bluetooth for OPP service.

Could anybody tell me what is wrong in the below code,

/// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >

if ( SOCKET_ERROR == ( ulRetCode = getsockname(LocalSocket, (struct
sockaddr *)&SockAddrBthLocal, &iAddrLen) ) )
{
printf("getsockname() call failed w/socket = [0x%X].
WSAGetLastError=[%d]\n", LocalSocket, WSAGetLastError());
goto CleanupAndExit;
}

BYTE jPortNo = *((BYTE *)&SockAddrBthLocal.port);

//
// CSADDR_INFO
//
lpCSAddrInfo[0].LocalAddr.iSockaddrLength = sizeof( SOCKADDR_BTH );
lpCSAddrInfo[0].LocalAddr.lpSockaddr = (LPSOCKADDR)&SockAddrBthLocal;
lpCSAddrInfo[0].RemoteAddr.iSockaddrLength = sizeof( SOCKADDR_BTH );
lpCSAddrInfo[0].RemoteAddr.lpSockaddr = (LPSOCKADDR)&SockAddrBthLocal;
lpCSAddrInfo[0].iSocketType = SOCK_STREAM;
lpCSAddrInfo[0].iProtocol = BTHPROTO_RFCOMM;

//
// If we got an address, go ahead and advertise it.
//
ZeroMemory(&wsaQuerySet, sizeof(WSAQUERYSET));

wsaQuerySet.dwSize = sizeof(WSAQUERYSET);
wsaQuerySet.lpszServiceInstanceName = L"Object Push Profile";
wsaQuerySet.lpServiceClassId = (LPGUID) &g_guidServiceClass;
// wsaQuerySet.lpszComment = L"Example Service instance registered in the
directory service through RnR";
wsaQuerySet.dwNameSpace = NS_BTH;
wsaQuerySet.dwNumberOfCsAddrs = 1; // Must be 1.
wsaQuerySet.lpcsaBuffer = lpCSAddrInfo; // Req'd.

/*
* Note: 0x35
=> Type descriptor is DataElement Sequeunce
=> Size is mentioned in the following 1 byte
*/

static BYTE rgbSdpRecord[] = {
// SDP size
0x35, 0x00, // Note: The size is filled below.

0x09,


// ServiceClassIDList
0x00, 0x01,

// Service Classes
0x35, 0x03, // 3 bytes

// OBEXObjectPush 0x1105
0x19, 0x11, 0x05,

0x09,


// ProtocolDescriptorList
0x00, 0x04,

// Protocol ID List
0x35, 0x11, // 17 bytes


// L2CAP (0x0100)
0x35, 0x03, // 3 bytes
0x19, 0x01, 0x00,

// RFCOMM (0x0003)
0x35, 0x05, // 5 bytes
0x19, 0x00, 0x03, // ID
0x08, jPortNo,

//0x05, // Channel Number is (5)

// OBEX (0x000
0x35, 0x03, // 3 bytes
0x19, 0x00, 0x08,
0x09,


// BluetoothProfileDescriptorList
0x00, 0x09,

0x35, 0x08, // 8 bytes
0x35, 0x06, // 6 bytes
0x19, 0x11, 0x05, // OBEXObjectPush
0x09, 0x01, 0x00, // Version

0x09,

// Service Name
0x01, 0x00,

0x25, 0x13, // Type - String, size - 19 bytes (Object Push Profile)

0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x50, 0x75, 0x73, 0x68, 0x20,
0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,

0x09,

// Supported Format List
0x03, 0x03,

0x35, 0x0e, // 14 bytes

0x08, 0x01, // vCard 2.1
0x08, 0x02, // vCard 3.0
0x08, 0x03, // vCard 1.0
0x08, 0x04, // iCal 2.0
0x08, 0x05, // vNote
0x08, 0x06, // vMessage
0x08, 0xff // Any type of object
};

const size_t iRecSize = sizeof(rgbSdpRecord) / sizeof(BYTE);

rgbSdpRecord[1] = iRecSize - 2; // -2 for excluding first 2 bytes

BTH_SET_SERVICE *pbthSetService;
HANDLE recordHandle = NULL;
ULONG ulSdpVersion = BTH_SDP_VERSION;

pbthSetService = (BTH_SET_SERVICE *) calloc(sizeof(BTH_SET_SERVICE) +
iRecSize, sizeof(BYTE));

pbthSetService->pRecordHandle = &recordHandle;
pbthSetService->pSdpVersion = &ulSdpVersion;

SET_COD_MAJOR((pbthSetService->fCodService), COD_MAJOR_COMPUTER);
SET_COD_MINOR((pbthSetService->fCodService), COD_COMPUTER_MINOR_DESKTOP);
SET_COD_SERVICE((pbthSetService->fCodService), COD_SERVICE_OBJECT_XFER);

pbthSetService->fCodService = 0x100104;

pbthSetService->ulRecordLength = iRecSize;
memcpy(pbthSetService->pRecord, rgbSdpRecord, iRecSize);

BLOB blob;
blob.cbSize = sizeof(BTH_SET_SERVICE) + iRecSize - 1;
blob.pBlobData = (PBYTE) pbthSetService;

wsaQuerySet.lpBlob = &blob;

//
// As long as we use a blocking accept(), we will have a race
// between advertising the service and actually being ready to
// accept connections. If we use non-blocking accept, advertise
// the service after accept has been called.
//
if ( SOCKET_ERROR == WSASetService(&wsaQuerySet, RNRSERVICE_REGISTER, 0))
{
printf("WSASetService() call failed. WSAGetLastError=[%d]\n",
WSAGetLastError());
goto CleanupAndExit;
}

/// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <

Regards,
Dandi


Dandi
  Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are Off
Pingbacks are Off
Refbacks are Off

Similar Threads
Thread Thread Starter Forum Replies Last Post
Back button doesn't work when it is a secure page returning to a non secure page Miss Mary General Help Related Topics 1 09-21-2007 10:32 AM
Re: IT Jobs Returning to the U.S.? Pat A+ Certification 0 10-28-2003 05:21 AM
Problems Returning NetFlix DVD's Andrew Schumer DVD Video 2 10-26-2003 03:35 AM
Re: IT Jobs Returning to the U.S.? Tony Sivori A+ Certification 2 10-24-2003 02:15 PM




SEO by vBSEO 3.3.2 ©2009, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46