BOOL CBTAsyncSocket::SetPIN(int nIndex, char* szPIN)
{
LPDEVICEINFO_DATA RomteDeviceInfo = m_arrDiscovers.GetAt(nIndex);
BTH_SOCKOPT_SECURITY bth_sockopt; memset(&bth_sockopt, 0, sizeof(bth_sockopt));
bth_sockopt.iLength = strlen(szPIN);
bth_sockopt.btAddr = RomteDeviceInfo->Address;//改为0也是一样 char szBuf[32] ; 
memset(szBuf, 0, sizeof(szBuf));
strcpy(szBuf, szPIN);
memcpy(bth_sockopt.caData,szBuf,strlen(szBuf)+1);  if(setsockopt(m_hSocket, SOL_RFCOMM, SO_BTH_SET_PIN, (char *)&bth_sockopt, sizeof(BTH_SOCKOPT_SECURITY)) == SOCKET_ERROR )
{
int nError = WSAGetLastError();
TRACE(L"%d", nError);//返回的是10038
return FALSE;
}
return TRUE;
}
想去建立有密钥的连接,这样错在哪?返回的是10038还是要用另一参数SO_BTH_SET_LINK呢?

解决方案 »

  1.   

    10038
    Socket operation on nonsocket. m_hSocket 是否已经 socket(), bind() 了?
      

  2.   

    另外, "The PIN is an ASCII string that is not terminated by \0" 而是通过 iLength 成员指定长度的~
    你应该使用这样的方式
    bth_sockopt.iLength = strlen(szBuf);
    memcpy(bth_sockopt.caData,szBuf,bth_sockopt.iLength); 
    if(setsockopt(m_hSocket, SOL_RFCOMM, SO_BTH_SET_PIN, (char *)&bth_sockopt, sizeof(BTH_SOCKOPT_SECURITY)) == SOCKET_ERROR ) 
      

  3.   

    socket()了,在client发setsockopt(),不用bind()吧