蓝牙Socket编程与FD_CLOSE

drjojo 2006-08-03 06:57:33
最新小弟在做蓝牙Socket编程,蓝牙设备作为Client时候,与另一设备进行通信,双方能建立连接,并且发送与接收消息都正常.可是一分钟后,双方通信就自动断开了,查看程序是收到了FD_CLOSE命令.请问具体是什么原因使通信产生FD_CLOSE命令?不胜感激!!!!
附程序:
客户端:
void CBtCmderDlg::OnButtonClient()
{
// TODO: Add your control notification handler code here
BLUETOOTH_SELECT_DEVICE_PARAMS btsdp;
WSADATA wsaData;
SOCKADDR_BTH SockAddr = {0};

btsdp.dwSize = sizeof(btsdp);
btsdp.cNumOfClasses = 0;
btsdp.prgClassOfDevices = NULL;
btsdp.pszInfo = NULL;
btsdp.hwndParent = NULL;
btsdp.fForceAuthentication = FALSE;
btsdp.fShowAuthenticated = TRUE;
btsdp.fShowRemembered = TRUE;
btsdp.fShowUnknown = TRUE;
btsdp.fAddNewDeviceWizard = FALSE;
btsdp.fSkipServicesPage = FALSE;
btsdp.pfnDeviceCallback = NULL;
btsdp.pvParam = NULL;
btsdp.cNumDevices = 0;

if (WSAStartup(WINSOCK_VERSION, &wsaData) != 0)
{
m_strStatus = "WSAStartup Error";
UpdateData(FALSE);
return;
}
if (wsaData.wVersion != WINSOCK_VERSION)
{
WSACleanup();
m_strStatus = "Version Error";
UpdateData(FALSE);
return;
}
if (!BluetoothSelectDevices(&btsdp))
{
WSACleanup();
m_strStatus = "Select Device Fail";
UpdateData(FALSE);
return;
}

if (btsdp.cNumDevices != 1)
{
BluetoothSelectDevicesFree(&btsdp);
WSACleanup();
m_strStatus = "(btsdp.cNumDevices != 1) Error";
UpdateData(FALSE);
return;
}

CString strTemp;
for (int i = 5; i >0 ; i--)
{
strTemp.Format("%X",btsdp.pDevices->Address.rgBytes[i]);
if(strTemp.GetLength() == 1)
strTemp.Insert(0,'0');
m_strAddr = m_strAddr + strTemp + CString(" : ");
}

strTemp.Format("%X ",btsdp.pDevices->Address.rgBytes[0]);
m_strAddr += strTemp;

m_strName = &(btsdp.pDevices->szName[0]);

SockAddr.addressFamily = AF_BTH;
SockAddr.btAddr = btsdp.pDevices->Address.ullLong;
SockAddr.port = 2;
BluetoothSelectDevicesFree(&btsdp);

btClientSocket = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);

if (btClientSocket == INVALID_SOCKET)
{
WSACleanup();
m_strStatus = "socket Function Error";
UpdateData(FALSE);
return;
}

unsigned long ul = 1;
if(SOCKET_ERROR == (ioctlsocket(btClientSocket,FIONBIO,(unsigned long *)&ul)))
{
WSACleanup();
m_strStatus = "Set socket non-bolking mode fail";
UpdateData(FALSE);
return;

}

if(connect(btClientSocket, (SOCKADDR *) &SockAddr, sizeof(SockAddr)) == 0)
m_strStatus = "Connected";
else
{
if (WSAGetLastError() != WSAEWOULDBLOCK)
{
OnButtonDisconnect();
m_strStatus = "Connect Fail";
UpdateData(FALSE);
return;
}
else
m_strStatus = "Connecting";
}

if(SOCKET_ERROR == (WSAAsyncSelect(btClientSocket,m_hWnd,WM_BTCLIENTEVENT,
FD_CONNECT|FD_CLOSE|FD_READ)))
m_strStatus = "WSAAsyncSelect() Function Error";

UpdateData(FALSE);
}

============================
I/O管理:
LRESULT CBtCmderDlg::OnBtClientEvent(WPARAM wParam, LPARAM lParam)
{
if(WSAGETSELECTERROR(lParam))
{
OnButtonDisconnect();
MessageBox(_T("Socket event error"),NULL,MB_OK);
return 0;
}
switch(WSAGETSELECTEVENT(lParam))
{
case FD_CONNECT:
{
m_strStatus = "Connected";
break;
}

case FD_CLOSE:
{
m_strStatus = "Disconnected";
break;
}
case FD_READ:
{
char DatBuf[512] = "0";
recv(btClientSocket, &DatBuf[0],512, 0);
m_strRecv = DatBuf;
break;
}
default:
break;
}

UpdateData(FALSE);
return 0;
}
==================================
请各位大虾多多指教,谢谢!!!!!!!!!!
...全文
343 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Torch009 2007-03-03
  • 打赏
  • 举报
回复
up
greenery 2007-03-01
  • 打赏
  • 举报
回复
顶。
drjojo 2006-08-04
  • 打赏
  • 举报
回复
什么情况下SOCKET通信会产生FD_CLOSE命令?
drjojo 2006-08-04
  • 打赏
  • 举报
回复
对方是一个串口的蓝牙设备,用2个该设备并调用他们的UI进行相连是没有问题的.
nuaawenlin 2006-08-03
  • 打赏
  • 举报
回复
是不是对端close了????

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧