这是网上下的代码,体现了select的使用
DWORD WINAPI Connect_Thread(LPVOID lpParam)
{
CTest_NonBlockSocket_ClientDlg *pDlg=(CTest_NonBlockSocket_ClientDlg *)lpParam;
SOCKET sock=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN server;
server.sin_family=AF_INET;
server.sin_addr.s_addr=inet_addr(serverip);
server.sin_port=htons(listenport);
if(connect(sock,(SOCKADDR *)&server,sizeof(server))==SOCKET_ERROR)
{
closesocket(sock);
CString temp;
temp.Format("connect error:%d",WSAGetLastError());
// CStdioFile m_file("C://123.txt",CFile::modeCreate|CFile::modeWrite);
// m_file.WriteString(temp);
// pDlg->m_list.AddString(temp);
MessageBox(pDlg->m_hWnd,"ERR",temp,MB_OK);
return 0;
}
fd_set fdRecv;
fd_set fdSend;
timeval seltime;
int iRecv=0;
int iSend=0;
CArray<int,int> arraySendBuffer;
CRITICAL_SECTION cs_array;
InitializeCriticalSection(&cs_array);
bool isConnect=TRUE;
while(isConnect)
{
FD_ZERO(&fdRecv);
FD_ZERO(&fdSend);
FD_SET(sock,&fdRecv);
FD_SET(sock,&fdSend);
int ret=select(0,&fdRecv,&fdSend,NULL,&seltime);
if(ret==SOCKET_ERROR)
{
isConnect=FALSE;
break;
}
else if(ret==0)
continue;
if(FD_ISSET(sock,&fdRecv))
{
char buffer[512];
ret=recv(sock,buffer,sizeof(buffer),0);
if(ret==0)
{
isConnect=FALSE;
break;
}
int nleft=0;
while(ret>0) //处理粘包
{
memcpy(&iRecv,buffer+nleft,4);
nleft+=4;
ret-=4;
CString temp;
temp.Format("recv %d;Len:%d",iRecv,ret);
pDlg->m_list.AddString(temp);
EnterCriticalSection(&cs_array);
TRACE("ADD");
arraySendBuffer.Add(iRecv);
LeaveCriticalSection(&cs_array);
}
}
if(FD_ISSET(sock,&fdSend)&&arraySendBuffer.GetSize()>0)
{
int i=0;
while(i<arraySendBuffer.GetSize())
{
EnterCriticalSection(&cs_array);
TRACE("GET");
iSend=arraySendBuffer.GetAt(i);
LeaveCriticalSection(&cs_array);
char buffer[4];
memcpy(buffer,&iSend,sizeof(iSend));
if(send(sock,buffer,sizeof(iSend),0)==SOCKET_ERROR)
{isConnect=FALSE;break;}
arraySendBuffer.RemoveAt(i);
i=i+1;
}
}
}
closesocket(sock);
return 0;
}