Advertisement
tuanln

Select TCP Server

Sep 25th, 2015
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 KB | None | 0 0
  1. // selectTCPServer.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "conio.h"
  6. #include "stdio.h"
  7. #include "winsock2.h"
  8. #include "ws2tcpip.h"
  9.  
  10. SOCKET s, c[1204];
  11. int nClient = 0;
  12. SOCKADDR_IN sAddr;
  13. SOCKADDR_IN cAddr;
  14.  
  15. DWORD WINAPI SenderThread(LPVOID Param) {
  16.     char buf[1024];
  17.     char msg[1024];
  18.     while (true) {
  19.         fgets(buf, 1024, stdin);
  20.         sprintf(msg, "Server: %s\n", buf);
  21.         for (int i = 0; i < nClient; i++)
  22.             if (c[i != 0]) {
  23.                 send(c[i], msg, strlen(msg), 0);
  24.             }
  25.     }
  26.     return 0;
  27. }
  28.  
  29.  
  30. int main()
  31. {
  32.     WSADATA wsadata;
  33.     int ret = WSAStartup(MAKEWORD(2, 2), &wsadata);
  34.     if (ret == SOCKET_ERROR) printf("Create winsock fail.");
  35.     else printf("Create winsock success.\n");
  36.  
  37.     s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  38.  
  39.     sAddr.sin_family = AF_INET;
  40.     sAddr.sin_port = htons(10008);
  41.     sAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  42.  
  43.     int clientlen = sizeof(cAddr);
  44.  
  45.     for (int j = 0; j < 1024; j++) {
  46.         c[j] = 0;
  47.     }
  48.        
  49.  
  50.     c[0] = s;
  51.     nClient = 1;
  52.  
  53.     ret = bind(s, (sockaddr*)&sAddr, sizeof(sAddr));
  54.     ret = listen(s, 16);
  55.  
  56.     fd_set fdread;
  57.     int i;
  58.     char buf[1024];
  59.     char msg[1024];
  60.     int len;
  61.     timeval tm;
  62.     bool tachluong = false;
  63.  
  64.     while (true) {
  65.         FD_ZERO(&fdread);
  66.         FD_SET(s, &fdread);
  67.         for (i = 0; i < nClient; i++) {
  68.             if (c[i] != 0) FD_SET(c[i], &fdread);
  69.         }
  70.  
  71.         tm.tv_sec = 5;
  72.         tm.tv_usec = 0;
  73.  
  74.         ret = select(0, &fdread, 0, 0, &tm);
  75.         if (ret == SOCKET_ERROR) break;
  76.         if (ret == 0) {
  77.             printf("Khong co su kien nao xay ra\n");
  78.             continue;
  79.         }
  80.         if (FD_ISSET(s, &fdread)) {
  81.             for (i = 1; i < nClient; i++)
  82.                 if (c[i] == 0) break;
  83.             c[i] = accept(s, (sockaddr*)&cAddr, &clientlen);
  84.             printf("Client %d connectd\n", i);
  85.             char * szHello = "Hello client\n";
  86.             send(c[i], szHello, strlen(szHello), 0);
  87.             if (tachluong == false) {
  88.                 CreateThread(0, 0, SenderThread, 0, 0, 0);
  89.                 tachluong = true;
  90.             }
  91.             if (i == nClient) nClient++;
  92.         }
  93.         for (i = 1; i < nClient; i++) {
  94.             if (FD_ISSET(c[i], &fdread)) {
  95.                 len = recv(c[i], buf, 1024, 0);
  96.                 if (len > 0) {
  97.                     buf[len] = 0;
  98.                     printf("Client %d: %s\n", i, buf);
  99.                     sprintf(msg, "Client %d: %s\n", i, buf);
  100.                     for (int k = 1; k < nClient; k++) {
  101.                         if (k != i && c[k] != 0)
  102.                             send(c[k], msg, strlen(msg), 0);
  103.                     }
  104.                 }
  105.                 else {
  106.                     closesocket(c[i]);
  107.                     c[i] = 0;
  108.                     printf("Client %d ngat ket noi\n", i);
  109.                 }
  110.  
  111.             }
  112.         }
  113.     }
  114.  
  115.     closesocket(s);
  116.     WSACleanup();
  117.  
  118.  
  119.     return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement