Advertisement
Sooldierr

UDP -Broadcast

Mar 28th, 2017
519
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.05 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <WinSock2.h>
  3. #include <conio.h>
  4.  
  5. #define END WSACleanup(); getch(); return 0;
  6. #define END2 shutdown(gniazdo,2); closesocket(gniazdo); WSACleanup(); getch(); return 0;
  7. #define ESC 27
  8. #define SPACE 32
  9. #define ENTER 13
  10. #define S 0
  11.  
  12. #pragma comment(lib,"ws2_32.lib")
  13. using namespace std;
  14.  
  15. struct datagram
  16. {
  17.     char A;
  18.     char imie[7];
  19.     char Z;
  20.     char nazwisko[9];
  21. };
  22.  
  23. struct potwierdzenie
  24. {
  25.     char A;
  26.     char Z;
  27. };
  28.  
  29. int _tmain(int argc, _TCHAR* argv[])
  30. {
  31.     WSAData wsaData;
  32.     datagram *W = new datagram();
  33.     W->A = 0x32;
  34.     W->Z = 0x0A;
  35.     strcpy(W->imie, "Daniel");
  36.     strcpy(W->nazwisko, "Splawski");
  37.  
  38.     if((WSAStartup(MAKEWORD(2,2),&wsaData))!=0)
  39.     {
  40.         printf("Blad ladowania biblioteki : %d",WSAGetLastError());
  41.         END
  42.     }
  43.  
  44.     SOCKET gniazdo;
  45.  
  46.     if((gniazdo=socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)
  47.     {
  48.         printf("Blad ladowania gniazda : %d",WSAGetLastError());
  49.         END2
  50.     }
  51.  
  52.     SOCKADDR_IN client;
  53.     client.sin_family = AF_INET;
  54.     client.sin_addr.s_addr = INADDR_ANY;
  55.     client.sin_port=htons(0);
  56.  
  57.  
  58.     if((bind(gniazdo,(SOCKADDR*)&client,sizeof(client)))==SOCKET_ERROR)
  59.     {
  60.         printf("Blad bindowania gniazda : %d",WSAGetLastError());
  61.         END2
  62.     }
  63.     SOCKADDR_IN serwer;
  64.     serwer.sin_family=AF_INET;
  65.     serwer.sin_addr.s_addr=inet_addr("192.168.0.104");
  66.     serwer.sin_port=htons(7404);
  67.     int sAddrSize = sizeof(serwer);
  68.  
  69.     ////////////////////////////////////////////////////////////////////////
  70.  
  71.     timeval time = { 0, 100000 };
  72.     fd_set set;
  73.     int one = 1;
  74.    
  75.     int przycisk;
  76.     printf("dowolny przycisk aby wyslac dane || aby zakonczyc nacisnij esc\n");
  77.    
  78.     while(true)
  79.     {
  80.         FD_ZERO(&set);
  81.         FD_SET(S, &set);
  82.         if (select(0, &set, 0, 0, &time) > 0)
  83.         {
  84.             if (FD_ISSET(S, &set) )
  85.             {
  86.                
  87.             }
  88.         }
  89.         if (_kbhit() )
  90.         {
  91.             przycisk = _getch();
  92.             if(przycisk == ESC)
  93.                 return 0;
  94.  
  95.             else if(przycisk == SPACE)
  96.             {
  97.                 setsockopt(gniazdo, SOL_SOCKET, SO_BROADCAST, (char*)&one, sizeof(one));
  98.                 serwer.sin_addr.s_addr = INADDR_BROADCAST;
  99.                 if(SOCKET_ERROR == sendto(gniazdo,(char*)&W,sizeof(*W),0,(SOCKADDR*)&serwer,sizeof(serwer)))
  100.                 {
  101.                     printf("blad wysylanych danych %d\n",WSAGetLastError());
  102.                     getch();
  103.                 }
  104.             }
  105.  
  106.             else if(przycisk == ENTER)
  107.             {
  108.                 setsockopt(gniazdo, SOL_SOCKET, SO_REUSEADDR, (char*) &one, sizeof(one));
  109.                 serwer.sin_addr.s_addr = inet_addr("192.168.0.104");
  110.                 if (SOCKET_ERROR == recvfrom(gniazdo, (char*) &W, sizeof(*W), 0, (SOCKADDR*)&serwer, &sAddrSize))
  111.                 {
  112.                     printf("blad wysylanych danych %d\n", WSAGetLastError());
  113.                     getch();
  114.                 }
  115.                 cout << W->A << W->imie << W->Z << W->nazwisko;
  116.                 potwierdzenie *P = new potwierdzenie();
  117.                 P->A = 0x32;
  118.                 P->Z = 0x01;
  119.  
  120.                 if (SOCKET_ERROR == sendto(gniazdo, (char*)&P, sizeof(*P), 0, (SOCKADDR*)&serwer, sizeof(serwer)))
  121.                 {
  122.                     printf("blad wysylanych danych %d\n", WSAGetLastError());
  123.                     getch();
  124.                 }
  125.             }
  126.  
  127.         }
  128.     }
  129.         //wysłanie do serwera danych
  130.         //if(SOCKET_ERROR == sendto(gniazdo,qwe,sizeof(qwe),0,(SOCKADDR*)&serwer,sizeof(serwer)))
  131.         //{
  132.         //  printf("blad wysylania : %d\n",WSAGetLastError());
  133.         //  getch();
  134.         //}
  135.  
  136.  
  137.         double tab[50];
  138.         int rozmiar = sizeof(serwer);
  139.         int err;
  140.  
  141.         //odebranie wartości od serwera
  142.        
  143.         err=(int)recvfrom(gniazdo,(char*)&tab,sizeof(double)*50,0,(SOCKADDR*)&serwer,&rozmiar);
  144.        
  145.         if(err<0)
  146.         {
  147.             printf("blad wysylania : %d\n",WSAGetLastError());
  148.             getch();
  149.             //continue;
  150.         }
  151.  
  152.         double suma=0;
  153.         err= err/sizeof(double);
  154.  
  155.         // jak bys chcial sprawdzic ze bledy czasem sypia wystarczy zmienic err na wielkosc tablicy czyli 50 i odkomentowac if :P
  156.         for(int i=0;i<err;i++)
  157.         {
  158.             //if(tab[i]>=0)
  159.             suma+=tab[i];
  160.         }
  161.         printf("\nSuma : %f\n",suma);
  162.         // zwrócenie otrzymanej sumy z serwera z powrotem do niego w celu weryfikacji poprawności otrzymanych danych
  163.         //int one = 1;
  164.         setsockopt( gniazdo, SOL_SOCKET, SO_BROADCAST, (char*) &one, sizeof(one));
  165.         if(SOCKET_ERROR==sendto(gniazdo,(char*)&W,sizeof(double),0,(SOCKADDR*)&serwer,sizeof(serwer)))
  166.         {
  167.             printf("blad wysylanych danych %d\n",WSAGetLastError());
  168.             getch();
  169.         }
  170.     END2
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement