Advertisement
Guest User

Untitled

a guest
Jul 10th, 2012
1,191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.97 KB | None | 0 0
  1. #include "ServerSocket.h"
  2.  
  3. int error(char* error) { cout << "An error occured when calling " << error << endl; return 0; }
  4.  
  5. //////////////////////////////
  6. //// CLIENT OBJECT
  7. //////////////////////////////
  8. ServerClient::ServerClient(SOCKET socket, ServerSocket* server)
  9. {
  10.     this->socket = socket;
  11.     this->server = server;
  12.     cout << "Client connected on port: " << this->server->port << endl;
  13. }
  14.  
  15. ServerClient::~ServerClient(void)
  16. {
  17.     closesocket(this->socket);
  18. }
  19.  
  20.  
  21. //////////////////////////////
  22. //// SERVER OBJECT
  23. //////////////////////////////
  24. ServerSocket::ServerSocket(short port, ParseDataCallback* parseCallback)
  25. {
  26.     this->port = port;
  27.     this->isConnected = false;
  28.     this->parseCallback = parseCallback;
  29.  
  30.     WSADATA wsaData;
  31.  
  32.     if (WSAStartup(0x101, &wsaData) != 0)
  33.         return;
  34.  
  35.     sockaddr_in local;
  36.     {
  37.         local.sin_family = AF_INET;
  38.         local.sin_addr.s_addr = INADDR_ANY;
  39.         local.sin_port = htons(this->port);
  40.     }
  41.  
  42.     this->listener = socket(AF_INET, SOCK_STREAM, 0);
  43.     if(this->listener == INVALID_SOCKET)
  44.         return;
  45.  
  46.     if(bind(this->listener,(sockaddr*)&local, sizeof(local)) != 0)
  47.         return;
  48.  
  49.     if(listen(this->listener, 10)!=0)
  50.         return;
  51.  
  52.     this->isConnected = true;
  53.     this->listenerThread = AfxBeginThread(ServerSocket::ListenerThreadCallback, (LPVOID)this);
  54. }
  55.  
  56. ServerSocket::~ServerSocket(void)
  57. {
  58.     this->isConnected = false;
  59.     closesocket(this->listener);
  60.     WSACleanup();
  61.  
  62.     WaitForSingleObject(this->listenerThread->m_hThread, INFINITE);
  63.     delete this->listenerThread;
  64.  
  65.     for (list<ServerClient*>::iterator cClient = this->clients.begin(); cClient != this->clients.end(); cClient++)
  66.         delete (*cClient);
  67.  
  68.     this->clients.clear();
  69. }
  70.  
  71. SOCKET ServerSocket::AcceptClient()
  72. {
  73.     sockaddr_in from;
  74.     int fromlen = sizeof(from);
  75.     return accept(this->listener, (sockaddr*)&from, &fromlen); 
  76. }
  77.  
  78. UINT ServerSocket::ListenerThreadCallback(LPVOID pParam)
  79. {
  80.     ServerSocket* server = (ServerSocket*)pParam;
  81.  
  82.     timeval time;
  83.     time.tv_sec = 0;
  84.     time.tv_usec = 5000; //1MS
  85.  
  86.     fd_set master;
  87.     {
  88.         FD_ZERO(&master);
  89.         FD_SET(server->listener, &master);
  90.     }
  91.  
  92.     while (server->isConnected)
  93.     {
  94.         fd_set temp = master;
  95.         if (select(NULL, &temp, NULL, NULL, &time) == -1)
  96.             return error("select()");
  97.        
  98.         if (FD_ISSET(server->listener, &temp)) //check if we have clients waiting to connect
  99.         {
  100.             SOCKET client = server->AcceptClient();
  101.             if (client != INVALID_SOCKET)
  102.             {
  103.                 FD_SET(client, &master); //add to the file descriptor
  104.                 server->clients.push_back(new ServerClient(client, server));
  105.             }
  106.             else
  107.                 return error("accept()");
  108.         }
  109.  
  110.         for (list<ServerClient*>::iterator cClient = server->clients.begin(); cClient != server->clients.end(); cClient++)
  111.         {
  112.             if (FD_ISSET((*cClient)->socket, &temp)) //check if this client has sent us data
  113.             {
  114.                 char temp[4096];
  115.                 if (recv((*cClient)->socket, temp, 4096, 0) == -1)
  116.                     return error("recv()");
  117.                 else
  118.                     server->parseCallback(server, (*cClient), (BYTE*)&temp);
  119.             }
  120.         }
  121.     }
  122.  
  123.     return 0;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement