Advertisement
tuanln

Blocking Chat Server

Sep 30th, 2015
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.47 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement