多个客户端连接到服务器端。
每个客户端给服务器端发送数据,服务器端都能收到。但是服务器端如果给客户端发数据,发现服务器端只能给最后连接的客户端发送数据,这是怎么回事?
服务器端部分代码:switch(WSAGETSELECTEVENT(lParam))
{
case FD_READ:
{
char buf[256];
ZeroMemory(buf,256);
recv((SOCKET)wParam,buf,sizeof(buf),0);
SetDlgItemText(hWnd,IDC_REVTXT,buf); //显示接受到的消息
}
break;
case FD_WRITE:
break;
case FD_CLOSE:
closesocket((SOCKET)wParam);
break;
case FD_CONNECT:
SetDlgItemText(hWnd,IDC_REVTXT,"已经连接上");//显示接受到的消息
MessageBox(NULL,"FD_CONNECT","",MB_OK);
break;
case FD_ACCEPT:
{
int Len = sizeof(clientaddr);
//建立连接,得到的地址存入客户端clientaddr地址中去
// socketNumber=socketNumber+1;
if((connected_skt=accept(skt,(struct sockaddr *)&clientaddr,&Len))== INVALID_SOCKET )
{
MessageBox(hWnd,"接受客户端的Socket连接失败", szDlgTitle,MB_OK);
return FALSE;
}else
{
//MessageBox(hWnd,"接受客户端的Socket连接成功", szDlgTitle,MB_OK);
}
//连接上了,然后监听客户端的FD_READ和关闭
WSAAsyncSelect(connected_skt, hWnd,SOCKETMSG,FD_READ|FD_CLOSE);
char *welcome="欢迎您!!";
MessageBox(hWnd,welcome, szDlgTitle,MB_OK);
}
break;
}
break;
每个客户端给服务器端发送数据,服务器端都能收到。但是服务器端如果给客户端发数据,发现服务器端只能给最后连接的客户端发送数据,这是怎么回事?
服务器端部分代码:switch(WSAGETSELECTEVENT(lParam))
{
case FD_READ:
{
char buf[256];
ZeroMemory(buf,256);
recv((SOCKET)wParam,buf,sizeof(buf),0);
SetDlgItemText(hWnd,IDC_REVTXT,buf); //显示接受到的消息
}
break;
case FD_WRITE:
break;
case FD_CLOSE:
closesocket((SOCKET)wParam);
break;
case FD_CONNECT:
SetDlgItemText(hWnd,IDC_REVTXT,"已经连接上");//显示接受到的消息
MessageBox(NULL,"FD_CONNECT","",MB_OK);
break;
case FD_ACCEPT:
{
int Len = sizeof(clientaddr);
//建立连接,得到的地址存入客户端clientaddr地址中去
// socketNumber=socketNumber+1;
if((connected_skt=accept(skt,(struct sockaddr *)&clientaddr,&Len))== INVALID_SOCKET )
{
MessageBox(hWnd,"接受客户端的Socket连接失败", szDlgTitle,MB_OK);
return FALSE;
}else
{
//MessageBox(hWnd,"接受客户端的Socket连接成功", szDlgTitle,MB_OK);
}
//连接上了,然后监听客户端的FD_READ和关闭
WSAAsyncSelect(connected_skt, hWnd,SOCKETMSG,FD_READ|FD_CLOSE);
char *welcome="欢迎您!!";
MessageBox(hWnd,welcome, szDlgTitle,MB_OK);
}
break;
}
break;
如果要给所有的链接发送消息的话,可以把所有链接的套接字保存在一个数组里面,然后循环遍历客户的套接字数组进行消息发送。
case FD_CONNECT:
中应该把新的socket句柄保存起来,要想给哪个客户端发信息,用保存起来的socket给他发信息。
Accept = accept(wParam, NULL, NULL);
WSAAsyncSelect(Accept, hWnd, WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE);//为新的socket注册异步事
AddSocket(Accept);//把套节字放到链表里面去
break;可以放到stl里的 map list 都可以再发送的时候,读取保存套节字里面的socket 我想发给谁,就发给谁