1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
//Server Side
#include <iostream>
#include <winsock2.h>
#include <windows.h>
#include <process.h>
using namespace std;
const int iReqWinsockVer = 2; // Minimum winsock version required
const int DEFAULT_PORT = 4444;
WSADATA wsaData;
SOCKET serverSocket;
unsigned __stdcall runServer(void * param);
bool running = true;
bool serverThreadFinnished = false;
vector<Table> tables;
int main()
{
if (WSAStartup(MAKEWORD(iReqWinsockVer,0), &wsaData)==0)
{
// Check if major version is at least iReqWinsockVer
if (!(LOBYTE(wsaData.wVersion) >= iReqWinsockVer))
{
cout << "Couldn't get WINSOCK version 2 or greater";
}
unsigned int threadID;
_beginthreadex(NULL, 0, runServer, NULL, 0, &threadID);
cout << "Enter X To Stop Server: ";
char userInput;
while(running)
{
cin >> userInput;
if(userInput == 'X')
{
cout << "Stopping Server" << endl;
running = false;
closesocket(serverSocket);
}
}
while(serverThreadFinnished == false)
{
//Wait for worker thread to finnish
}
cout << "Last Error: " << WSAGetLastError() << endl;
if (WSACleanup()!=0)
{
cout << "Cleanup Failed";
}
}
else
{
cout << "Startup Failed";
}
return 0;
}
unsigned __stdcall runServer(void * param)
{
SOCKET clientSocket;
sockaddr_in sockAddr = {0};
cout << "Creating socket... ";
if ((serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
cout << "Error creating server socket";
return 0;
}
cout << "created." << endl;
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons((u_short)DEFAULT_PORT);
sockAddr.sin_addr.S_un.S_addr = INADDR_ANY;
if (bind(serverSocket, reinterpret_cast<sockaddr*>(&sockAddr), sizeof(sockAddr))!=0)
{
cout << "Could not bind socket." << endl;
return 0;
}
cout << "Bound." << endl;
// Put socket in listening mode
cout << "Putting socket in listening mode... ";
if (listen(serverSocket, SOMAXCONN)!=0)
{
cout << "could not put socket in listening mode.";
return 0;
}
cout << "done." << endl;
while(running)
{
sockaddr_in clientSockAddr;
int clientSockSize = sizeof(clientSockAddr);
// Accept connection:
clientSocket = accept(serverSocket, reinterpret_cast<sockaddr*>(&clientSockAddr), &clientSockSize);
cout << "Get past here!" << endl;
bool playerAdded = false;
}
serverThreadFinnished = true;
return 1;
}
| |