没有用到MFC的SOCKET类库,自己封装了SOCKET API,开启了多线程ACCEPT(多线程)、SEND(多线程)、RECV(多线程)。问题是ACCEPT使用很正常,但是RECV用起来不是很正常,怎么判断RECV有数据进来,自启动。
还有就是在网上看到SELECT模型,对这个不是很懂(有没有必要用到这个)
请大家给简单讲讲
还有就是在网上看到SELECT模型,对这个不是很懂(有没有必要用到这个)
请大家给简单讲讲
解决方案 »
- 如何将整形数组传递给activex控件
- 关于WIN socket 连接耗时问题
- 请教Windows中键盘信息处理的几个问题。
- 如果VC从头开始学到COM大概每天多少小时要多长时间呢。
- 如和文件关闭得到通知
- 一段简单的代码,编译出错,谁来给我看看
- 关于picture控件刷新的问题
- 对话框控件的问题
- 关于“=”操作符重载问题。很急!有经验的朋友帮忙!!
- vc要做个视频采集的程序
- ADO中的 m_pRecordset.Realse()出错问题
- NewDlgDlg.obj : error LNK2019: unresolved external symbol "public: bool __thisca
我现在想实现一对多的连接,是不是用到SELECT模型是最理想的选择
还有就是想实现一个,当有数据进来的时候,启动RECV接收数据
#define WM_SOCKET WM_USER+101
ON_MESSAGE(WM_SOCKET,OnSocket);
LRESULT OnSocket(WPARAM wParam, LPARAM lParam);
... SOCKET sockListen
SOCKET sockClient;
sockListen = socket(...);
WSAAsyncSelect(sockListen,WM_SOCKET,...);
...
LRESULT XXX::OnSocket(WPARAM wParam, LPARAM lParam)
{
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT: //有连接请求
sockClient = accept();
WSAAsyncSelect(sockClient ,WM_SOCKET,...);
break;
case FD_RECV: //有数据进来
recv(...);
break;
case FD_Send:
break;
case FD_CLOSE: //有关闭
CloseSocket(...);
break;
}
方法二:使用Select;
创建一个线程
DWORD WorkThread(LPVOID lParam)
{
FD_ZERO(&fdsr); //清除一个文件描述符集
FD_SET(sockclient, &fdsr); // 把SOCKET加入到文件描述符集合 int nRet = select(maxsock + 1, &fdsr, NULL, NULL, &timeout); if (nRet < 0)
{
cout<<"select !error"<<endl;
break;
}
else if (nRet == 0)
{
cout<<"timeout"<<endl;
continue;
}
if (FD_ISSET((SOCKET)lpParam,&fdsr))
{
nRet = recv(sockclient,buffer,256,0);
f (nRet<=0)
{
m_pThis->DeleteOneClient(sockclient);
return 0;
}
else //接收数据成功
{
数据处理
}
}
}