异步非阻塞模式WSAAnyscSelect()模型的一连多的问题;
//.h文件的声明
SOCKET ServerSock;
SOCKET ClientSock[10]; //存储与客户端通信的Socket的数组
void InsertStringToListbox(char *strdisp);
void OnClose(SOCKET CurSock); //对端Socket断开
void OnSend(SOCKET CurSock); //发送网络数据包
void OnReceive(SOCKET CurSock); //网络数据包到达
void OnAccept(SOCKET CurSock); //客户端连接请求
BOOL InitNetwork(); //初始化网络函数
void OnNetEvent(WPARAM wParam, LPARAM lParam); //异步事件回调函数
int iport;
-----------------------------------------------------------------------
BOOL CTestSnycSelectDlg::InitNetwork()
{
WSADATA wsaData;
BOOL ret = WSAStartup(MAKEWORD(2,2), &wsaData);
if(ret != 0)
{
InsertStringToListbox("初始化网络协议失败!");
return FALSE;
}
else
{
InsertStringToListbox("初始化网络协议success!");
}
ServerSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(ServerSock == INVALID_SOCKET)
{
InsertStringToListbox("创建套接字失败!");
closesocket(ServerSock);
WSACleanup();
return FALSE;
}
else
{
InsertStringToListbox("创建套接字success!");
}
sockaddr_in localaddr;
localaddr.sin_family = AF_INET;
iport = 3000;
localaddr.sin_port = htons(iport); //端口号不要与其他应用程序冲突
//localaddr.sin_addr.s_addr = 0;
localaddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(ServerSock ,(struct sockaddr*)&localaddr,sizeof(sockaddr))
== SOCKET_ERROR)
{
InsertStringToListbox("绑定地址失败!");
closesocket(ServerSock);
WSACleanup();
return FALSE;
}
else
{
InsertStringToListbox("绑定地址success!");
}
if(WSAAsyncSelect(ServerSock, m_hWnd, NETWORK_EVENT,
FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE) == SOCKET_ERROR)
{
InsertStringToListbox("注册网络异步事件失败!");
WSACleanup();
return FALSE;
}
else
{
InsertStringToListbox("注册网络异步事件success!");
}
listen(ServerSock, 5); //设置侦听模式
return TRUE;
}
void CTestSnycSelectDlg::OnNetEvent(WPARAM wParam, LPARAM lParam)
{
//调用Winsock API函数,得到网络事件类型
int iEvent = WSAGETSELECTEVENT(lParam);
//调用Winsock API函数,得到发生此事件的客户端套接字
SOCKET CurSock= (SOCKET)wParam;
switch(iEvent)
{
case FD_ACCEPT: //客户端连接请求事件
OnAccept(CurSock);
break;
case FD_CLOSE: //客户端断开事件:
OnClose(CurSock);
break;
case FD_READ: //网络数据包到达事件
OnReceive(CurSock);
break;
case FD_WRITE: //发送网络数据事件
OnSend(CurSock);
break;
default: break;
}
}
void CTestSnycSelectDlg::OnAccept(SOCKET CurSock)
{
//接受连接请求,并保存与发起连接请求的客户端进行通信Socket
//为新的socket注册异步事件,注意没有Accept事件
for(int i = 0;i < 10;i++ )
{
if(ClientSock[i] == 0)
{
ClientSock[i] = accept(CurSock,NULL,NULL);
break;
}
}
WSAAsyncSelect(ClientSock[i],m_hWnd,NETWORK_EVENT,FD_WRITE|FD_CLOSE);
InsertStringToListbox("accept the data!");
}
void CTestSnycSelectDlg::OnClose(SOCKET CurSock)
{
//结束与相应的客户端的通信,释放相应资源
for(int i = 0;i < 10;i++ )
{
if(ClientSock[i] == CurSock)
{
closesocket(CurSock);
WSACleanup();
break;
}
}
InsertStringToListbox("close the socket!");
}
void CTestSnycSelectDlg::OnSend(SOCKET CurSock)
{
//在给客户端发数据时做相关预处理
int rc;
char Buffer[100] = "OnSend";
for(int i = 0;i < 10;i++ )
{
if(ClientSock[i] == CurSock)
{
rc = send(ClientSock[i],Buffer,sizeof(Buffer), 0);
break;
}
}
if (rc == SOCKET_ERROR) {
InsertStringToListbox("send出错!");
}
if (rc ==0) {
InsertStringToListbox("send正确!");
}
}
void CTestSnycSelectDlg::OnReceive(SOCKET CurSock)
{
//读出网络缓冲区中的数据包
char Buffer[100];
int rc;
for(int i = 0;i < 10;i++ )
{
if(ClientSock[i] == CurSock)
{
rc = recv(CurSock,Buffer,sizeof(Buffer),0);
break;
}
}
if (rc == SOCKET_ERROR) {
InsertStringToListbox("Recv出错!");
}
if (rc ==0) {
InsertStringToListbox("Recv正确!");
}
}
//为什么我只能连接一个客户端????错在哪里?