Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "ServerSocket.h"
- int error(char* error) { cout << "An error occured when calling " << error << endl; return 0; }
- //////////////////////////////
- //// CLIENT OBJECT
- //////////////////////////////
- ServerClient::ServerClient(SOCKET socket, ServerSocket* server)
- {
- this->socket = socket;
- this->server = server;
- cout << "Client connected on port: " << this->server->port << endl;
- }
- ServerClient::~ServerClient(void)
- {
- closesocket(this->socket);
- }
- //////////////////////////////
- //// SERVER OBJECT
- //////////////////////////////
- ServerSocket::ServerSocket(short port, ParseDataCallback* parseCallback)
- {
- this->port = port;
- this->isConnected = false;
- this->parseCallback = parseCallback;
- WSADATA wsaData;
- if (WSAStartup(0x101, &wsaData) != 0)
- return;
- sockaddr_in local;
- {
- local.sin_family = AF_INET;
- local.sin_addr.s_addr = INADDR_ANY;
- local.sin_port = htons(this->port);
- }
- this->listener = socket(AF_INET, SOCK_STREAM, 0);
- if(this->listener == INVALID_SOCKET)
- return;
- if(bind(this->listener,(sockaddr*)&local, sizeof(local)) != 0)
- return;
- if(listen(this->listener, 10)!=0)
- return;
- this->isConnected = true;
- this->listenerThread = AfxBeginThread(ServerSocket::ListenerThreadCallback, (LPVOID)this);
- }
- ServerSocket::~ServerSocket(void)
- {
- this->isConnected = false;
- closesocket(this->listener);
- WSACleanup();
- WaitForSingleObject(this->listenerThread->m_hThread, INFINITE);
- delete this->listenerThread;
- for (list<ServerClient*>::iterator cClient = this->clients.begin(); cClient != this->clients.end(); cClient++)
- delete (*cClient);
- this->clients.clear();
- }
- SOCKET ServerSocket::AcceptClient()
- {
- sockaddr_in from;
- int fromlen = sizeof(from);
- return accept(this->listener, (sockaddr*)&from, &fromlen);
- }
- UINT ServerSocket::ListenerThreadCallback(LPVOID pParam)
- {
- ServerSocket* server = (ServerSocket*)pParam;
- timeval time;
- time.tv_sec = 0;
- time.tv_usec = 5000; //1MS
- fd_set master;
- {
- FD_ZERO(&master);
- FD_SET(server->listener, &master);
- }
- while (server->isConnected)
- {
- fd_set temp = master;
- if (select(NULL, &temp, NULL, NULL, &time) == -1)
- return error("select()");
- if (FD_ISSET(server->listener, &temp)) //check if we have clients waiting to connect
- {
- SOCKET client = server->AcceptClient();
- if (client != INVALID_SOCKET)
- {
- FD_SET(client, &master); //add to the file descriptor
- server->clients.push_back(new ServerClient(client, server));
- }
- else
- return error("accept()");
- }
- for (list<ServerClient*>::iterator cClient = server->clients.begin(); cClient != server->clients.end(); cClient++)
- {
- if (FD_ISSET((*cClient)->socket, &temp)) //check if this client has sent us data
- {
- char temp[4096];
- if (recv((*cClient)->socket, temp, 4096, 0) == -1)
- return error("recv()");
- else
- server->parseCallback(server, (*cClient), (BYTE*)&temp);
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement