下面是服务器端的一段代码,服务器端启动,紧接着启动两个客户端,结果发现:两个客户端都能成功连接服务器端,但是发送数后,只有第二个启动的客户端数据可以到达服务器端,而第一个启动的客户端发送的数据无法到达服务器端。这是为什么? ...
                     WSAStartup(MAKEWORD(2,0),&wsaData);
                     sockfd=socket(AF_INET,SOCK_STREAM,0);
                     my_server.sin_family=AF_INET;
                     my_server.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//htonl(INADDR_ANY);
                     my_server.sin_port=htons(5000);//htons(5000);
 
                    if (bind(sockfd, (struct sockaddr *)&my_server, sizeof(struct sockaddr)) <0) {
         
                       ShowError();
                 
                    }  
                    if (listen(sockfd,2) == -1) {
                      ShowError();
                     //perror("listen Error!");
                     //exit(1);
                    } 
                     WSAAsyncSelect(sockfd,hWnd,SOCKETMSG,FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE);
...
case SOCKETMSG:
 
                 switch(WSAGETSELECTEVENT(lParam))
                 {  
                      case FD_READ:
                           {
                             char buf[256];
                             ZeroMemory(buf,256);
                             recv(connected_skt,buf,sizeof(buf),0);
                             SetDlgItemText(hWnd,IDC_REVTXT,buf); //显示接受到的消息
                           }
                           break;
                      case FD_WRITE:
                           break;
                      case FD_CLOSE:
                           closesocket(connected_skt);
                           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.   

    这个只能接受最后连接的Client,当最后一个连接上将他前一个连接的socket对象connected_skt冲掉了发生了变化。
      

  2.   

    服务器新accept的socket怎么都是用connected_sk一个变量存储?
    这样只有最后一个连接的socket号被保存下来,之前建立的socket号被丢了,所以只有最后一个可以接收到数据。
      

  3.   

    你的服务器端程序要搞个循环,并且要加上新连接处理,类似以下代码:
    while (Runing)
    {
    status = listen(serverSocket, 5);
    if (status == SOCKET_ERROR)
    {
    AfxMessageBox("ERROR: listen unsuccsessful!" + GetLastError(), MB_OK);
    return;
    } clientSocket = accept(s, (LPSOCKADDR)&clientSockAddr, &addrLen);
    AfxBeginThread(RecvDataProc, (LPVOID)clientSocket);


    }
      

  4.   


    那WSAAsyncSelect应该放到哪里?
      

  5.   

    WSAAsyncSelect是WinSock的事件通知,在bind后就可以调用该API了!
      

  6.   

    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;