多个客户端连接到服务器端。
每个客户端给服务器端发送数据,服务器端都能收到。但是服务器端如果给客户端发数据,发现服务器端只能给最后连接的客户端发送数据,这是怎么回事?
服务器端部分代码: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; 

解决方案 »

  1.   

    当接收到一个连接时,wparam为和对方通信的套接字,此时当FD_WRITE事件触发时,由于wapram是最后一个连接的套接字,当然只发给它了。
    如果要给所有的链接发送消息的话,可以把所有链接的套接字保存在一个数组里面,然后循环遍历客户的套接字数组进行消息发送。
      

  2.   


     case FD_CONNECT:
    中应该把新的socket句柄保存起来,要想给哪个客户端发信息,用保存起来的socket给他发信息。
      

  3.   

              case FD_ACCEPT:

                    Accept = accept(wParam, NULL, NULL);
                    WSAAsyncSelect(Accept, hWnd, WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE);//为新的socket注册异步事
    AddSocket(Accept);//把套节字放到链表里面去
    break;可以放到stl里的 map list 都可以再发送的时候,读取保存套节字里面的socket  我想发给谁,就发给谁