Guest User

main.cpp

a guest
Jan 24th, 2015
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.99 KB | None | 0 0
  1. #define WIN32_LEAN_AND_MEAN
  2.  
  3. #include<windows.h>
  4. #include<winsock.h>
  5. #include<stdio.h>
  6.  
  7. #define BACKLOG 4
  8.  
  9. SOCKET soocket[3];
  10. HANDLE threaad;
  11. HANDLE eveent;
  12. int errror = false;
  13. bool terminate = false;
  14.  
  15. DWORD WINAPI ServerThread1(LPVOID);
  16. DWORD WINAPI ServerThread2(LPVOID);
  17. DWORD WINAPI ServerThread3(LPVOID);
  18.  
  19. LPTHREAD_START_ROUTINE ServerThread[3] = {ServerThread1, ServerThread2, ServerThread3};
  20.  
  21. int main(void){
  22.     WSADATA wsadata;
  23.     int i, players;
  24.     SOCKADDR_IN serverinfo;
  25.     LPHOSTENT kjh;
  26.     IN_ADDR nji;
  27.     char nameppp[100];
  28.  
  29.     printf("Select number of players (2-4): ");
  30.     do {
  31.         players = getchar() - '2';
  32.     } while(players<0||players>2);
  33.    
  34.     if(WSAStartup(MAKEWORD(1, 1), &wsadata)!=0){
  35.         printf("Winsock couldn't be initialized.\n");
  36.         return 1;
  37.     }
  38.    
  39.     for(i=0;i<3;i++){
  40.         if((soocket[i]=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))==INVALID_SOCKET){
  41.             printf("Couldn't create socket (Error %d).\n", WSAGetLastError());
  42.             WSACleanup();
  43.             return 1;
  44.         }
  45.     }
  46.  
  47.     serverinfo.sin_family = AF_INET;
  48.     serverinfo.sin_addr.S_un.S_addr = INADDR_ANY;
  49.  
  50.     for(i=0;i<3;i++){
  51.         serverinfo.sin_port = htons(6478+i);
  52.         if(bind(soocket[i], (SOCKADDR*)&serverinfo, sizeof(SOCKADDR_IN))==SOCKET_ERROR){
  53.             for(i=0;i<3;i++)
  54.                 closesocket(soocket[i]);
  55.             printf("Error during bind(). Error code: %d\n", WSAGetLastError());
  56.             WSACleanup();
  57.             return 1;
  58.         }
  59.     }
  60.  
  61.     for(i=0;i<3;i++){
  62.         if(listen(soocket[i], BACKLOG)==SOCKET_ERROR){
  63.             printf("Error during listen(). Error code: %d\n", WSAGetLastError());
  64.             for(i=0;i<3;i++)
  65.                 closesocket(soocket[i]);
  66.             WSACleanup();
  67.             return 1;
  68.         }
  69.     }
  70.  
  71.     gethostname(nameppp, 100);
  72.     kjh = gethostbyname(nameppp);
  73.     memcpy(&nji, kjh->h_addr_list[0], sizeof(IN_ADDR));
  74.     printf("Server address: %s\n", inet_ntoa(nji));
  75.  
  76.     if((threaad=CreateThread(NULL, 0, ServerThread[players], &i, 0, 0))==NULL){
  77.         printf("Couldn't create server thread.\n");
  78.             for(i=0;i<3;i++)
  79.                 closesocket(soocket[i]);
  80.             WSACleanup();
  81.             return 1;
  82.     }
  83.    
  84.     if((eveent=CreateEvent(NULL, true, false, NULL))==NULL){
  85.         printf("Couldn't create event.\n");
  86.         for(i=0;i<3;i++)
  87.                 closesocket(soocket[i]);
  88.         WSACleanup();
  89.         return 1;
  90.     }
  91.  
  92.     printf("VBALink server running...\n");
  93.    
  94.     WaitForSingleObject(eveent, INFINITE);
  95.     if(errror){
  96.         printf("Errrrrrrrrrrroooooooooooor!!!!!!!!!!!!!");
  97.     }
  98.     printf("Press enter.\n");
  99.     getchar();
  100.    
  101.     for(i=0;i<3;i++){
  102.         closesocket(soocket[i]);
  103.     }
  104.     terminate = true;
  105.     CloseHandle(threaad);
  106.     WSACleanup();
  107.     return 0;
  108. }
  109.  
  110. DWORD WINAPI ServerThread1(LPVOID number){
  111.     SOCKET clientsocket[2];
  112.     char buffer[32];
  113.     int numbytes = 0;
  114.     SOCKADDR_IN clientinfo;
  115.     int sizee = sizeof(SOCKADDR_IN);
  116.     if((clientsocket[0]=accept(soocket[0], (LPSOCKADDR)&clientinfo, &sizee))==INVALID_SOCKET){
  117.         errror =true;
  118.         ExitThread(0);
  119.     }
  120.  
  121.     printf("Player #1 connected from %s\n", inet_ntoa(clientinfo.sin_addr));
  122.  
  123.     if((clientsocket[1]=accept(soocket[0], (LPSOCKADDR)&clientinfo, &sizee))==INVALID_SOCKET){
  124.         errror =true;
  125.         ExitThread(0);
  126.     }
  127.  
  128.     printf("Player #2 connected from %s\n", inet_ntoa(clientinfo.sin_addr));
  129.  
  130.     buffer[0] = 0;
  131.     send(clientsocket[0], buffer, 4, 0);
  132.     buffer[0] = 1;
  133.     send(clientsocket[1], buffer, 4, 0);
  134.     printf("OK.\n");
  135.     while(true){
  136.         if(terminate){
  137.             ExitThread(0);
  138.         }
  139.         numbytes = 0;
  140.         while(numbytes<8){
  141.             numbytes += recv(clientsocket[0], buffer+numbytes, 8, 0);
  142.         }
  143.         //putchar('k');
  144.         if(buffer[0]=='S'||buffer[4]=='S'){
  145.             send(clientsocket[1], buffer, 8, 0);
  146.             closesocket(clientsocket[0]);
  147.             closesocket(clientsocket[1]);
  148.             SetEvent(eveent);
  149.             ExitThread(0);
  150.         }
  151.         send(clientsocket[1], buffer, 8, 0);
  152.         numbytes = 0;
  153.         while(numbytes<4){
  154.             numbytes += recv(clientsocket[1], buffer+numbytes, 4, 0);
  155.         }
  156.         if(buffer[0]=='S'){
  157.             send(clientsocket[0], buffer, 8, 0);
  158.             closesocket(clientsocket[0]);
  159.             closesocket(clientsocket[1]);
  160.             SetEvent(eveent);
  161.             ExitThread(0);
  162.         }
  163.         send(clientsocket[0], buffer, 4, 0);
  164.     }
  165.     return 0;
  166. }
  167.  
  168. DWORD WINAPI ServerThread2(LPVOID number){
  169.     SOCKET clientsocket[3];
  170.     char buffer[32];
  171.     DWORD data[3] = {0, 0xffff434d, 0xffff834d};
  172.     int numbytes = 0, linktime;
  173.     SOCKADDR_IN clientinfo;
  174.     int sizee = sizeof(SOCKADDR_IN);
  175.     if((clientsocket[0]=accept(soocket[1], (LPSOCKADDR)&clientinfo, &sizee))==INVALID_SOCKET){
  176.         errror =true;
  177.         ExitThread(0);
  178.     }
  179.  
  180.     printf("Player #1 connected from %s\n", inet_ntoa(clientinfo.sin_addr));
  181.  
  182.     if((clientsocket[1]=accept(soocket[1], (LPSOCKADDR)&clientinfo, &sizee))==INVALID_SOCKET){
  183.         errror =true;
  184.         ExitThread(0);
  185.     }
  186.  
  187.     printf("Player #2 connected from %s\n", inet_ntoa(clientinfo.sin_addr));
  188.  
  189.     if((clientsocket[2]=accept(soocket[1], (LPSOCKADDR)&clientinfo, &sizee))==INVALID_SOCKET){
  190.         errror =true;
  191.         ExitThread(0);
  192.     }
  193.  
  194.     printf("Player #3 connected from %s\n", inet_ntoa(clientinfo.sin_addr));
  195.  
  196.     buffer[0] = 0;
  197.     send(clientsocket[0], buffer, 4, 0);
  198.     buffer[0] = 1;
  199.     send(clientsocket[1], buffer, 4, 0);
  200.     buffer[0] = 2;
  201.     send(clientsocket[2], buffer, 4, 0);
  202.  
  203.     printf("OK.\n");
  204.  
  205.     while(true){
  206.         if(terminate){
  207.             ExitThread(0);
  208.         }
  209.         numbytes = 0;
  210.         while(numbytes<8){
  211.             numbytes += recv(clientsocket[0], buffer+numbytes, 8, 0);
  212.         }
  213.         if(buffer[0]=='S'){
  214.             send(clientsocket[1], buffer, 12, 0);
  215.             send(clientsocket[2], buffer, 12, 0);
  216.             closesocket(clientsocket[0]);
  217.             closesocket(clientsocket[1]);
  218.             closesocket(clientsocket[2]);
  219.             SetEvent(eveent);
  220.             ExitThread(0);
  221.         }
  222.  
  223.         data[0] = *(DWORD*)buffer;
  224.         linktime = *((int*)buffer+1);
  225.         *((DWORD*)buffer+2) = data[2];
  226.         send(clientsocket[1], buffer, 12, 0);
  227.        
  228.         *((DWORD*)buffer+2) = data[1];
  229.         send(clientsocket[2], buffer, 12, 0);
  230.  
  231.         numbytes = 0;
  232.         while(numbytes<4){
  233.             numbytes += recv(clientsocket[1], buffer+numbytes, 4, 0);
  234.         }
  235.         if(buffer[0]=='S'){
  236.             send(clientsocket[0], buffer, 8, 0);
  237.             send(clientsocket[2], buffer, 12, 0);
  238.             closesocket(clientsocket[0]);
  239.             closesocket(clientsocket[1]);
  240.             closesocket(clientsocket[2]);
  241.             SetEvent(eveent);
  242.             ExitThread(0);
  243.         }
  244.  
  245.         data[1] = *(DWORD*)buffer;
  246.        
  247.         numbytes = 4;
  248.         while(numbytes<8){
  249.             numbytes += recv(clientsocket[2], buffer+numbytes, 4, 0);
  250.         }
  251.         if(buffer[0]=='S'){
  252.             send(clientsocket[0], buffer, 8, 0);
  253.             send(clientsocket[1], buffer, 12, 0);
  254.             closesocket(clientsocket[0]);
  255.             closesocket(clientsocket[1]);
  256.             closesocket(clientsocket[2]);
  257.             SetEvent(eveent);
  258.             ExitThread(0);
  259.         }
  260.         data[2] = *((DWORD*)buffer+1);
  261.         send(clientsocket[0], buffer, 8, 0);
  262.  
  263.     }
  264.     return 0;
  265. }
  266.  
  267. DWORD WINAPI ServerThread3(LPVOID number){
  268. SOCKET clientsocket[4];
  269.     char buffer[32];
  270.     DWORD data[4] = {0, 0xffff434d, 0xffff834d, 0xffffc34d};
  271.     int numbytes = 0, linktime;
  272.     SOCKADDR_IN clientinfo;
  273.     int sizee = sizeof(SOCKADDR_IN);
  274.     if((clientsocket[0]=accept(soocket[2], (LPSOCKADDR)&clientinfo, &sizee))==INVALID_SOCKET){
  275.         errror =true;
  276.         ExitThread(0);
  277.     }
  278.  
  279.     printf("Player #1 connected from %s\n", inet_ntoa(clientinfo.sin_addr));
  280.  
  281.     if((clientsocket[1]=accept(soocket[2], (LPSOCKADDR)&clientinfo, &sizee))==INVALID_SOCKET){
  282.         errror =true;
  283.         ExitThread(0);
  284.     }
  285.  
  286.     printf("Player #2 connected from %s\n", inet_ntoa(clientinfo.sin_addr));
  287.  
  288.     if((clientsocket[2]=accept(soocket[2], (LPSOCKADDR)&clientinfo, &sizee))==INVALID_SOCKET){
  289.         errror =true;
  290.         ExitThread(0);
  291.     }
  292.  
  293.     printf("Player #3 connected from %s\n", inet_ntoa(clientinfo.sin_addr));
  294.  
  295.     if((clientsocket[3]=accept(soocket[2], (LPSOCKADDR)&clientinfo, &sizee))==INVALID_SOCKET){
  296.         errror =true;
  297.         ExitThread(0);
  298.     }
  299.  
  300.     printf("Player #4 connected from %s\n", inet_ntoa(clientinfo.sin_addr));
  301.  
  302.     buffer[0] = 0;
  303.     send(clientsocket[0], buffer, 4, 0);
  304.     buffer[0] = 1;
  305.     send(clientsocket[1], buffer, 4, 0);
  306.     buffer[0] = 2;
  307.     send(clientsocket[2], buffer, 4, 0);
  308.     buffer[0] = 3;
  309.     send(clientsocket[3], buffer, 4, 0);
  310.  
  311.     printf("OK.\n");
  312.  
  313.     while(true){
  314.         if(terminate){
  315.             ExitThread(0);
  316.         }
  317.         numbytes = 0;
  318.         while(numbytes<8){
  319.             numbytes += recv(clientsocket[0], buffer+numbytes, 8, 0);
  320.         }
  321.         if(buffer[0]=='S'){
  322.             send(clientsocket[1], buffer, 16, 0);
  323.             send(clientsocket[2], buffer, 16, 0);
  324.             send(clientsocket[3], buffer, 16, 0);
  325.             closesocket(clientsocket[0]);
  326.             closesocket(clientsocket[1]);
  327.             closesocket(clientsocket[2]);
  328.             closesocket(clientsocket[3]);
  329.             SetEvent(eveent);
  330.             ExitThread(0);
  331.         }
  332.  
  333.         data[0] = *(DWORD*)buffer;
  334.         linktime = *((int*)buffer+1);
  335.         *((DWORD*)buffer+2) = data[2];
  336.         *((DWORD*)buffer+3) = data[3];
  337.         send(clientsocket[1], buffer, 16, 0);
  338.        
  339.         *((DWORD*)buffer+2) = data[1];
  340.         send(clientsocket[2], buffer, 16, 0);
  341.  
  342.         *((DWORD*)buffer+2) = data[2];
  343.         *((DWORD*)buffer+3) = data[1];
  344.         send(clientsocket[3], buffer, 16, 0);
  345.  
  346.         numbytes = 0;
  347.         while(numbytes<4){
  348.             numbytes += recv(clientsocket[1], buffer+numbytes, 4, 0);
  349.         }
  350.         if(buffer[0]=='S'){
  351.             send(clientsocket[0], buffer, 12, 0);
  352.             send(clientsocket[2], buffer, 16, 0);
  353.             send(clientsocket[3], buffer, 16, 0);
  354.             closesocket(clientsocket[0]);
  355.             closesocket(clientsocket[1]);
  356.             closesocket(clientsocket[2]);
  357.             closesocket(clientsocket[3]);
  358.             SetEvent(eveent);
  359.             ExitThread(0);
  360.         }
  361.  
  362.         data[1] = *(DWORD*)buffer;
  363.        
  364.         numbytes = 4;
  365.         while(numbytes<8){
  366.             numbytes += recv(clientsocket[2], buffer+numbytes, 4, 0);
  367.         }
  368.         if(buffer[0]=='S'){
  369.             send(clientsocket[0], buffer, 12, 0);
  370.             send(clientsocket[1], buffer, 16, 0);
  371.             send(clientsocket[3], buffer, 16, 0);
  372.             closesocket(clientsocket[0]);
  373.             closesocket(clientsocket[1]);
  374.             closesocket(clientsocket[2]);
  375.             closesocket(clientsocket[3]);
  376.             SetEvent(eveent);
  377.             ExitThread(0);
  378.         }
  379.        
  380.         data[2] = *((DWORD*)buffer+1);
  381.  
  382.         numbytes = 8;
  383.         while(numbytes<12){
  384.             numbytes += recv(clientsocket[3], buffer+numbytes, 4, 0);
  385.         }
  386.         if(buffer[0]=='S'){
  387.             send(clientsocket[0], buffer, 12, 0);
  388.             send(clientsocket[1], buffer, 16, 0);
  389.             send(clientsocket[2], buffer, 16, 0);
  390.             closesocket(clientsocket[0]);
  391.             closesocket(clientsocket[1]);
  392.             closesocket(clientsocket[2]);
  393.             closesocket(clientsocket[3]);
  394.             SetEvent(eveent);
  395.             ExitThread(0);
  396.         }
  397.  
  398.         data[3] = *((DWORD*)buffer+2);
  399.         send(clientsocket[0], buffer, 12, 0);
  400.  
  401.     }
  402.     return 0;
  403. }
Advertisement
Add Comment
Please, Sign In to add comment