积极答复者
求助!!! 重叠模型之Select I/O 网络编程

问题
-
DWORD WINAPI CCallServerDlg::ThreadSelect(LPVOID lpParameter)
{
SOCKET sListen=(SOCKET)lpParameter;
FD_SET fdSocket;
FD_ZERO(&fdSocket);
FD_SET(sListen,&fdSocket);
CString strIP;
timeval timeout;
timeout.tv_sec=5;
_SENDDATA recvPacket;//需要注意的地方
MateMap::iterator iter;while(true)
{
fd_set fdRead = fdSocket;
int nRet=:elect(0,&fdRead,NULL,NULL,NULL);
if(nRet>0)
{
//检查是否有新数据或者新客户发送过来
for(int i=0;i<(int)fdSocket.fd_count;i++)
{
//检查是否有新连接的到来
if(FD_ISSET( fdSocket.fd_array, &fdRead))
{ if(fdSocket.fd_array==sListen)
{
sockaddr_in addrRemote;
int nAddrLen=sizeof(addrRemote);
SOCKET sNew=::accept(sListen,(sockaddr*)&addrRemote,&nAddrLen);
FD_SET(sNew,&fdSocket);
strIP.Format( "%s",inet_ntoa(addrRemote.sin_addr) );
CString str;
str.Format("the clinet have Come IP is %s",strIP);
WriteLog("log.txt",str);
} //end if
else
{
int nRecev=::recv(fdSocket.fd_array,(char*)&recvPacket,sizeof(recvPacket),0);
if(nRecev>0)
{
if(recvPacket.szTel[0]=='N')
{
TRACE("the clinet exited ,the channel is%i\b \n",recvPacket.iExNum);critical_section.Lock();
g_myMap.erase(recvPacket.iExNum);
critical_section.Unlock();
CString str;
str.Format("the channel is %d has exit",recvPacket.iExNum);
WriteLog("log.txt",str);::closesocket(fdSocket.fd_array
);
FD_CLR(fdSocket.fd_array,&fdSocket);
}
else
{
//判断此IP是否已经在MAP中
iter = g_myMap.find(recvPacket.iExNum);
if( iter==g_myMap.end())
{
int inum = recvPacket.iExNum;
critical_section.Lock();
//将获得的分机号与之对应的socket放于map中.
g_myMap.insert(ValueType(recvPacket.iExNum,fdSocket.fd_array));
critical_section.Unlock();
CString str;
str.Format("the channel is %d has login",recvPacket.iExNum);
WriteLog("log.txt",str);
}}
}
else
{
::closesocket(fdSocket.fd_array);
FD_CLR(fdSocket.fd_array,&fdSocket);
}
}
}
}
}
}
return 0;}
上面是主要代码.
此段代码是服务器部分,在服务器不发送数据给客户端的情况下.
服务器可以正常地接收客户端的连接,并加入到MAP中,且在日志中出现连接成功的记录.
如果服务器在其它地方发送数据给任一客户端,则服务器不能接受新建的连接,日志中没有任何操作记录.
请问用什么方法可以解决?
难道要监听写操作?那应该如何在其它地方调用 呢?