SELECT 模型,多客戶單服務器.

#include <stdio.h>
#include <iostream>
#include <winsock2.h>
using namespace std;
int main(){
    WORD version = MAKEWORD(2,2);
    WSADATA wsaData;
    SOCKET listenSocket;
    SOCKET acceptSocket;
    SOCKET clientSocket[FD_SETSIZE];
    int static index = 0;
    DWORD block = 1L;
    FD_SET ReadSet;
   //加載SOCKET庫

    int f = WSAStartup(version,&wsaData);
    if (f != 0){
        cout<<"加載Winsock 庫錯誤! 錯誤號:"<<WSAGetLastError()<<endl;
        return -1;

    }

    //創建監聽SOCKET

    listenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
    if (listenSocket == INVALID_SOCKET){
        WSACleanup();
        cout<<"創建監聽SOCKET失敗! 錯誤號:"<<WSAGetLastError()<<endl;
        return -1;

    }
    cout<<"監聽SOCKET創建成功!/n"<<endl;

    //構造服務器地址

    SOCKADDR_IN serverIp;

                serverIp.sin_family = AF_INET;
                serverIp.sin_port = htons(8108);
                serverIp.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    if (bind(listenSocket,(SOCKADDR*)&serverIp,sizeof(SOCKADDR)) == SOCKET_ERROR){
        cout<<"綁定服務器錯誤! 錯誤號:"<<WSAGetLastError()<<endl;
        return -1;

 

    }

    cout<<"綁定操作成功!/n"<<endl;
    if (listen(listenSocket,10) == SOCKET_ERROR){
        cout<<"進入監聽模式錯誤! 錯誤號:"<<WSAGetLastError()<<endl;
        return -1;
    }
    cout<<"服務器已進入監聽模式!/n"<<endl;

    if (ioctlsocket(listenSocket,FIONBIO,&block) == SOCKET_ERROR){
Cout<<"監聽SOCKET設置爲非阻塞模式錯誤! 錯誤號:"<<WSAGetLastError()<<endl;

        return -1;

    }

    cout<<"監聽SOCKET已設置爲非阻塞模式!/n/n/n"<<endl;


    //非阻塞模式接受客戶端連接

    while(TRUE){

          cout<<"持續按非阻塞模式接受客戶端連接請求!/n/n"<<endl;
          //將讀SET 清0

          FD_ZERO(&ReadSet);

          //將已有客戶端連接放到集合中!

          for (int i = 0; i < index; i  ){

        cout<<"將clientSocket["<<i<<"]放到ReadSet集合中!/n"<<endl;

               FD_SET(clientSocket[i],&ReadSet);
          }
        cout<<"監聽SOCKET 放入 ReadSet集合中!/n/n"<<endl;

          FD_SET(listenSocket,&ReadSet);
          if (select(0,&ReadSet,NULL,NULL,NULL) == SOCKET_ERROR

              cout<<"select 監聽SOCET錯誤! 錯誤號:"<<WSAGetLastError()<<endl;
              system("pause");
              return -1;
          }

          cout<<"select 返回 說明已有客戶端進行連接或有客戶端數據讀取或有客戶端連接斷開!/n/n/n"<<endl;

              if (FD_ISSET(listenSocket,&ReadSet)){

                  cout<<"當前ReadSet中存監聽SOCKET!/n/n"<<endl;
                  acceptSocket = accept(listenSocket,NULL,NULL);
                  if (acceptSocket != INVALID_SOCKET){
             cout<<"客戶端建立連接成功並保存到clientSocket["<<index<<"]中!/n/n"<<endl;
                      clientSocket[index] = acceptSocket;
                      index++   ;

                  }else {
                      cout<<"接收客戶端連接錯誤! 錯誤號:"<<WSAGetLastError()<<endl;

                   continue;

                  }
              }

              for (int j = 0; j < index; j  ){

                  if (FD_ISSET(clientSocket[j],&ReadSet)){
                      cout<<"當前ReadSet集合中有客戶端SOCKET clientSocket["<<j<<"]可讀數據!/n [message]"

                      char buffer[100]; memset(buffer,0,100);

                      if (recv(clientSocket[j],buffer,100,0) != SOCKET_ERROR){

                          cout<<buffer<<"[/messsage]/n"<<endl;

                      }else {

                          cout<<"客戶端clientSocket["<<j<<"]出現錯誤! 錯誤號:"<<WSAGetLastError()<<endl;
                          clientSocket[j] = NULL;

                          index --;
                          closesocket(clientSocket[j])
                          break;

                      }


 }            }
    }
  }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章