SHARE
TWEET

Blocking Chat Server

tuanln Sep 30th, 2015 (edited) 150 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ChatServer.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <stdio.h>
  6. #include <conio.h>
  7. #include <WinSock2.h>
  8. #include <WS2tcpip.h>
  9.  
  10. struct ClientInfo {
  11.         SOCKET          c;
  12.         SOCKADDR_IN     cAddr;
  13.         char            szNickname[32];
  14.         bool            bState;
  15. };
  16.  
  17. ClientInfo * pClients[1024];
  18. int                      nClient = 0;
  19. bool             bIsStop = false;
  20. SOCKET  s;
  21. DWORD   WINAPI          ClientThread(LPVOID lParam)
  22. {
  23.         int     i = (int)lParam;
  24.         char    szCmd[1024];
  25.         char    szResponse[1024];
  26.         int      len;
  27.         int j;
  28.         bool kt;
  29.         printf("Client %d dat ket noi !\n", i);
  30.         while (1){
  31.                 len = recv(pClients[i]->c, szCmd, 1024, 0);
  32.                 if (len > 0){
  33.                         szCmd[len - 1] = 0;
  34.                         if (strnicmp(szCmd, "login ", 6) == 0){// lenh login
  35.                                 strcpy(pClients[i]->szNickname, szCmd + 6);
  36.                                 kt = false;
  37.                                 for (j = 0; j < nClient;j++)
  38.                                 if (pClients[j] != 0 && pClients[j]->bState==true&&
  39.                                         j!=i)
  40.                                 if (strcmp(pClients[j]->szNickname,
  41.                                         pClients[i]->szNickname) == 0){
  42.                                         kt = true;
  43.                                         break;
  44.                                 };
  45.                                 if (stricmp(pClients[i]->szNickname, "*") == 0)
  46.                                         kt = true;
  47.                                 if (kt == true){
  48.                                         sprintf(szResponse,
  49.                                                 "[Error]%s already in use !\n",
  50.                                                 pClients[i]->szNickname);
  51.                                         send(pClients[i]->c, szResponse,
  52.                                                 strlen(szResponse), 0);
  53.                                 }
  54.                                 else{
  55.                                         pClients[i]->bState = true;
  56.                                         sprintf(szResponse, "[Info]%s logged in!\n",
  57.                                                 pClients[i]->szNickname);
  58.                                         printf(szResponse);
  59.                                         for (j = 0; j < nClient;j++)
  60.                                         if (pClients[j] != 0 && pClients[j]->bState == true)
  61.                                                 send(pClients[j]->c, szResponse,
  62.                                                 strlen(szResponse), 0);
  63.                                 };
  64.                                 continue;
  65.                         }
  66.                         if (strnicmp(szCmd, "chat * ", 7) == 0) {// chat *
  67.                                 if (pClients[i]->bState == false) continue;
  68.                                 sprintf(szResponse, "[%s]%s\n",
  69.                                         pClients[i]->szNickname, szCmd + 7);
  70.                                 printf(szResponse);
  71.                                 for (j = 0; j < nClient; j++)
  72.                                 if (i != j && pClients[j] != 0 &&
  73.                                         pClients[j]->bState == true)
  74.                                         send(pClients[j]->c, szResponse,
  75.                                         strlen(szResponse), 0);
  76.                                 continue;
  77.                         }
  78.                         if (strnicmp(szCmd, "chat ", 5)==0){
  79.                                 char szNickname[32];
  80.                                 char * pos = NULL;
  81.                                 pos = strchr(szCmd + 5, ' ');
  82.                                 if (pos != 0){
  83.                                         strncpy(szNickname, szCmd + 5, pos - szCmd - 5);
  84.                                         szNickname[pos - szCmd - 5] = 0;
  85.                                         for (j = 0; j < nClient;j++)
  86.                                         if (i != j && pClients[j] != 0 && pClients[j]->bState == true &&
  87.                                                 stricmp(szNickname, pClients[j]->szNickname) == 0){
  88.                                                 sprintf(szResponse, "[%s]%s\n",
  89.                                                         pClients[i]->szNickname, pos + 1);
  90.                                                 send(pClients[j]->c, szResponse, strlen(szResponse), 0);
  91.                                         };
  92.                                         if (stricmp(szNickname, "server") == 0)
  93.                                                 printf("[Private]%s\n", pos + 1);
  94.                                 };
  95.                                 continue;
  96.                         };
  97.                         sprintf(szResponse, "[Error]Unknown command!\n");
  98.                         send(pClients[i]->c, szResponse, strlen(szResponse), 0);
  99.                 }
  100.                 else {
  101.                         closesocket(pClients[i]->c);
  102.                         delete pClients[i];
  103.                         pClients[i] = 0;
  104.                         break;
  105.                 }
  106.         }
  107.         printf("Client %d ngat ket noi !\n", i);
  108.         return 0;
  109. }
  110. DWORD   WINAPI  SenderThread(LPVOID lParam)
  111. {
  112.         char szXau[1024];
  113.         char szMsg[1024];
  114.         while (1){
  115.                 gets(szXau);
  116.                 if (strnicmp(szXau, "quit", 4) == 0)
  117.                 {
  118.                         bIsStop = true;
  119.                         closesocket(s);
  120.                         break;
  121.                 }
  122.                 sprintf(szMsg, "[Server]%s\n", szXau);
  123.                 for (int i = 0; i < nClient;i++)
  124.                 if (pClients[i] != 0 && pClients[i]->bState == true)
  125.                         send(pClients[i]->c, szMsg, strlen(szMsg), 0);
  126.         };
  127.         return 0;
  128. }
  129. int _tmain(int argc, _TCHAR* argv[])
  130. {
  131.         WSADATA wsaData;
  132.         WORD    wVersion = MAKEWORD(2, 2);
  133.         int             ret = WSAStartup(wVersion, &wsaData);
  134.         s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  135.         SOCKADDR_IN     sAddr;
  136.         sAddr.sin_family = AF_INET;
  137.         sAddr.sin_port = htons(8888);
  138.         sAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  139.         ret = bind(s, (sockaddr*)&sAddr, sizeof(sAddr));
  140.         ret = listen(s, 16);
  141.         int i;
  142.         int     cAddrLen = sizeof(SOCKADDR_IN);
  143.         for (i = 0; i < 1024; i++) pClients[i] = 0;
  144.         bool bSenderThread = false;
  145.         while (1){
  146.                 for (i = 0; i < nClient; i++) if (pClients[i] == 0) break;
  147.                 pClients[i] = new ClientInfo;
  148.                 pClients[i]->c = accept(s, (sockaddr*)&pClients[i]->cAddr,
  149.                         &cAddrLen);
  150.                 if (bIsStop == true) break;
  151.                 CreateThread(0, 0, ClientThread, (LPVOID)i, 0, 0);
  152.                 if (i == nClient) nClient++;
  153.                 if (bSenderThread == false){
  154.                         CreateThread(0, 0, SenderThread, 0, 0, 0);
  155.                         bSenderThread = true;
  156.                 }
  157.         }
  158.         //closesocket(s);
  159.         for (i = 0; i < nClient;i++)
  160.         if (pClients[i] != 0){
  161.                 closesocket(pClients[i]->c);
  162.                 delete pClients[i];
  163.                 pClients[i] = 0;
  164.         };
  165.         WSACleanup();
  166.         printf("Server dat ket thuc !\n");
  167.         getch();
  168.         return 0;
  169. }
RAW Paste Data
Top