Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <WS2tcpip.h>
- #include <string>
- #include <sstream>
- #pragma comment (lib, "ws2_32.lib")
- #define NMAXCLIENTS 4
- int main()
- {
- WSADATA wsData;
- WORD ver = MAKEWORD(2, 2);
- int wsOk = WSAStartup(ver, &wsData);
- if (wsOk != 0)
- {
- std::cerr << "Error initializing winsock. Bye." << std::endl;
- return -1;
- }
- SOCKET listening = socket(AF_INET, SOCK_STREAM, 0);
- if (listening == INVALID_SOCKET)
- {
- std::cerr << "Error initializing a socket! Bye." << std::endl;
- return -2;
- }
- sockaddr_in hint;
- hint.sin_family = AF_INET;
- hint.sin_port = htons(54000);
- hint.sin_addr.S_un.S_addr = INADDR_ANY;
- bind(listening, (sockaddr*)&hint, sizeof(hint));
- listen(listening, NMAXCLIENTS);
- std::cout << "Server up and running." << std::endl << "Waiting for clients to connect..." << std::endl;
- fd_set master;
- FD_ZERO(&master);
- FD_SET(listening, &master);
- int numOfClients = 0;
- bool running = true;
- while (running)
- {
- fd_set copy = master;
- int socketCount = select(0, ©, nullptr, nullptr, nullptr);
- for (int i = 0; i < socketCount; i++)
- {
- SOCKET sock = copy.fd_array[i];
- // Inbound connection
- if (sock == listening)
- {
- SOCKET client = accept(listening, nullptr, nullptr);
- FD_SET(client, &master);
- numOfClients++;
- std::string welcomeMsg = "Connected to the server!\r\n";
- send(client, welcomeMsg.c_str(), welcomeMsg.size() + 1, 0);
- std::cout << "Number of clients connected: " << numOfClients << "\r\n";
- }
- // Inbound message
- else
- {
- char buf[4096];
- ZeroMemory(buf, 4096);
- // Receive message
- int bytesIn = recv(sock, buf, 4096, 0);
- std::cout << "Socket #" << sock << ": " << buf << "\r\n";
- if (bytesIn <= 0)
- {
- closesocket(sock);
- FD_CLR(sock, &master);
- numOfClients--;
- std::cout << "Number of clients connected: " << numOfClients << "\r\n";
- }
- else
- {
- if (buf[0] == 'N')
- {
- std::string name = std::string(buf, bytesIn);
- std::ostringstream clientNumMessageStream;
- clientNumMessageStream << "B" << numOfClients << "\r\n";
- std::string clientNumMessage = clientNumMessageStream.str();
- send(sock, clientNumMessage.c_str(), clientNumMessage.size() + 1, 0);
- }
- // Send message to other clients
- if (numOfClients == NMAXCLIENTS) {
- for (int i = 0; i < master.fd_count; i++)
- {
- SOCKET outSock = master.fd_array[i];
- if (outSock != listening)
- {
- std::string strOut = "P";
- send(outSock, strOut.c_str(), strOut.size() + 1, 0);
- }
- }
- }
- else if (numOfClients > NMAXCLIENTS) {
- std::cout << "Max client count exceeded, shutting down the server..." << std::endl;
- running = false;
- break;
- }
- }
- }
- }
- }
- FD_CLR(listening, &master);
- closesocket(listening);
- std::string msg = "Server is shutting down...\r\n";
- while (master.fd_count > 0)
- {
- SOCKET sock = master.fd_array[0];
- send(sock, msg.c_str(), msg.size() + 1, 0);
- FD_CLR(sock, &master);
- closesocket(sock);
- }
- WSACleanup();
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement