Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 25.71 KB | None | 0 0
  1. WNDCW07a
  2. /******************************************/
  3. /* Dziedziczenie strumieni przez procesy  */
  4. /* - kod programu dla procesu nadrzednego */
  5. /******************************************/
  6.  
  7. // dodatkowa konfiguracja dla kompilatora MSVC
  8. #pragma warning(disable:4244)
  9. #pragma warning(disable:4996 4005)
  10. #define _CRT_SECURE_NO_WARNINGS
  11. #define _USE_MATH_DEFINES
  12. #ifdef UNICODE
  13. # undef UNICODE
  14. # define _MBCS
  15. #endif
  16.  
  17. // pliki naglowkowe standardu jezyka C++ oraz interfejsu Win32 API:
  18. #include <cstdlib>
  19. #include <cstdio>
  20. #include <windows.h>
  21. using namespace std;
  22.  
  23. int main()
  24. {
  25.  CHAR obraz[MAX_PATH] = "potomny.exe"; // nazwa pliku z obrazem programu
  26.  CHAR polecenie[MAX_PATH]; // polecenie do zaladowania programu w ramach procesu
  27.  STARTUPINFO prolog; // rekord z elementami dla prologu procesu
  28.  PROCESS_INFORMATION program; // rekord z uchwytami procesu i glownego watka do wykonywania programu
  29.  BOOL sukces; // flaga sukcesu operacji
  30.  CHAR tymczasowy[MAX_PATH]; // nazwa pliku tymczasowego
  31.  HANDLE wymiana; // uchwyt pliku tymczasowego do dziedziczenia
  32.  SECURITY_ATTRIBUTES dziedziczenie = {sizeof (SECURITY_ATTRIBUTES), NULL, TRUE}; // atrybuty bezpieczenstwa dla dziedziczonych uchwytow (TRUE)
  33.  
  34.  sprintf(polecenie, "%s %d", obraz, 10); // formatowanie polecenia z nazwa obrazu oraz liczba krokow interakcji
  35.  
  36.  // utworzenie tymczasowego pliku wymiany danych pomiedzy procesami:
  37.  sukces = GetTempFileName(".", "xyz", 0, tymczasowy)!=0;
  38.  if (!sukces) {
  39.   printf("Blad utworzenia nazwy pliku tymczasowego!\n");
  40.   ExitProcess(-1);
  41.  }
  42.  wymiana = CreateFile(tymczasowy,
  43.                       GENERIC_READ | GENERIC_WRITE, // plik do operacji we/wy, ale tylko zapis bedzie potrzebny
  44.                       FILE_SHARE_READ | FILE_SHARE_WRITE, // plik we/wy bedzie wspoldzielony przez procesy
  45.                       &dziedziczenie, // plik bedzie dziedziczony
  46.                       CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
  47.  );
  48.  if (wymiana == INVALID_HANDLE_VALUE) {
  49.   printf("Blad otwarcia tymczasowego pliku wymiany!\n");
  50.   ExitProcess(-1);
  51.  }
  52.  
  53.  // utworzenie nowego procesu:
  54.  GetStartupInfo(&prolog); // skopiowanie elementow prologu z biezacego procesu
  55.  prolog.dwFlags = STARTF_USESTDHANDLES;
  56.  prolog.hStdOutput = wymiana; // obydwa wyjscia procesu sa przekierowane na plik wymiany
  57.  prolog.hStdError = wymiana;
  58.  prolog.hStdInput = GetStdHandle(STD_INPUT_HANDLE); // wejscie procesu jest standardowym strumieniem (klawiatura konsoli)
  59.  prolog.lpTitle = obraz; // tytul okna konsoli dla nowego procesu
  60.  sukces = CreateProcess(obraz, // nazwa programu
  61.                         polecenie, // j/w (polecenie zaladowania programu)
  62.                         NULL, // atrybuty bezpieczenstwa procesu
  63.                         NULL, // atrybuty bezpieczenstwa watka glownego
  64.                         TRUE, // flaga dziedziczenia uchwytow (zasobow) z biezacego procesu do nowego procesu
  65.                         CREATE_NEW_CONSOLE, // dodatkowe falgi tworzenia procesu, tu nowa konsola dla procesu
  66.                         NULL, // lancuch zawierajacy zmienne srodowiskowe dla nowego procesu lub dziedziczenie srodowiska biezacego procesu
  67.                         NULL, // lancuch ze sciezka do katalogu roboczego dla nowego procesu lub katalog biezacego procesu
  68.                         &prolog, // elementy prologu dla nowego procesu
  69.                         &program // uchywty procesu i watka programu
  70.  );
  71.  if (!sukces) {
  72.   printf("Blad tworzenia procesu!\n");
  73.   ExitProcess(-1);
  74.  }
  75.  CloseHandle(wymiana); // niskopoziomy strumien do pliku wymiany nie bedzie juz potrzebny w biezacym procesie, ale jest uzywany przez nowy proces  
  76.  CloseHandle(program.hThread); // zwolnienie uchwytu do watka (ale watek dalej istnieje bo jest uzywany przez nowy proces)
  77.  
  78.  // oczekiwanie na zakonczenie procesu wykonywania programu:
  79.  WaitForSingleObject(program.hProcess, INFINITE);
  80.  CloseHandle(program.hProcess); // zwolnienie uchwytu do procesu i usuniecie procesu
  81.  
  82.  // przetwarzanie pliku tymczasowego poprzez strumien biblioteki standardowej:
  83.  printf("Wyjscie z programu potomnego:\n\n");
  84.  printf(">>>>>>\n");
  85.  {
  86.   CHAR wiersz[120];
  87.   CHAR *nazwa = tymczasowy;
  88.   FILE *plik;
  89.  
  90.   plik = fopen(nazwa, "rt");
  91.   if (plik == NULL) {
  92.    printf("Blad otwarcia pliku wyjsciowego!\n");
  93.    exit(-1);
  94.   }
  95.  
  96.   while (!feof(plik)) {
  97.    if (fgets(wiersz, sizeof wiersz, plik)==NULL) break;
  98.    printf("%s", wiersz);
  99.   }
  100.  
  101.   fclose(plik);
  102.  }
  103.  printf("<<<<<<\n");
  104.  
  105.  // usuniecie tymczasowego pliku wymiany danych:
  106.  sukces = DeleteFile(tymczasowy);
  107.  if (!sukces) {
  108.   printf("Blad usuniecia tymczasowego pliku wymiany!\n");
  109.   ExitProcess(-1);
  110.  }
  111.  
  112.  getchar();
  113.  return 0;
  114. }
  115.  
  116. WNDCW07b
  117. /*****************************************/
  118. /* Dziedziczenie strumieni przez procesy */
  119. /* - kod programu dla procesu potomnego  */
  120. /*****************************************/
  121.  
  122. // dodatkowa konfiguracja dla kompilatora MSVC
  123. #pragma warning(disable:4244)
  124. #pragma warning(disable:4996 4005)
  125. #define _CRT_SECURE_NO_WARNINGS
  126. #define _USE_MATH_DEFINES
  127.  
  128. // pliki naglowkowe standardu jezyka C++:
  129. #include <cstdlib>
  130. #include <iostream>
  131. using namespace std;
  132.  
  133. int main(int argc, const char *argv[])
  134. {
  135.  int n;
  136.  cout << "POCZATEK PROGRAMU" << endl;
  137.  
  138.  // odczytanie argumentow programu:
  139.  if (argc < 2) abort();
  140.  n = atoi(argv[1]);
  141.  
  142.  // wykonanie prostej interakcji:
  143.  char dane[120];
  144.  for (int i=0; i<n; i++) {
  145.   cin.getline(dane, sizeof dane);
  146.   cout << (i+1) << ") " << dane << endl;
  147.  }
  148.  
  149.  cout << "KONIEC PROGRAMU" << endl;
  150.  return 0;
  151. }
  152.  
  153. WNDCW10A
  154. /***************************************************************************/
  155. /* Komunikacja miedzyprocesowa z uzyciem gniazd typu UDP - modul nadrzedny */
  156. /***************************************************************************/
  157. /* Niniejszy program stanowi nadrzedny modul w prostym systemie sieciowym.
  158.  * Program tworzy gniazdo typu UDP i rozpowszechnia komunikaty znakowe w sieci
  159.  * na danym porcie, obierane przez dowolne maszyny zdalne. Jednoczesnie program
  160.  * odbiera od sieci znaki alfabetu, z ktorego generowane sa znaki tekstu.
  161.  */
  162.  
  163. // dodatkowa konfiguracja dla kompilatora MSVC
  164. #pragma warning(disable:4244)
  165. #pragma warning(disable:4996 4005)
  166. #define _CRT_SECURE_NO_WARNINGS
  167. #define _USE_MATH_DEFINES
  168. #ifdef UNICODE
  169. # undef UNICODE
  170. # define _MBCS
  171. #endif
  172.  
  173. // pliki naglowkowe standardu C++ oraz interfejsu Win32API:
  174. #include <cstdio>
  175. #include <cstdlib>
  176. #include <cstring>
  177. #include <cctype>
  178. #include <ctime>
  179. using namespace std;
  180. #include <conio.h>
  181. #include <winsock2.h>
  182.  
  183. // dodatkowa konfiguracja dla linkera MSVC
  184. #pragma comment(lib, "ws2_32.lib")
  185.  
  186. // glowne parametry programu:
  187. const u_short iPort = 5000;
  188. const char cWiersz = '\n';
  189. const char cString = '\0';
  190. const char cKoniec = '\a';
  191. const char kEscape = '\33';
  192. const u_int nWiersz = 50;
  193. const size_t nAlfabet = 30;
  194.  
  195. // glowny kod programu:
  196. int main()
  197. {
  198.  printf(">> Poczatek programu <<\n\n");
  199.  
  200.  // pomocnicze zmienne programu:
  201.  WSADATA srodowisko;
  202.  SOCKET komunikacja;
  203.  u_short port;
  204.  sockaddr_in lokalny,dowolny,zdalny;
  205.  int rozmiar,znaki,kolumny;
  206.  char alfabet[nAlfabet+1];
  207.  BOOL rozpowszechnianie;
  208.  u_long bezblokowania;
  209.  
  210.  // odczytanie parametrow programu:
  211.  
  212.  printf("Podaj numer portu komunikacyjnego (np. %hu): ", iPort);
  213.  port = iPort;
  214.  scanf("%hu", &port);
  215.  
  216.  // otwarcie srodowiska Winsock 2.2 oraz gniazda do komunikacji typu UDP:
  217.  if (WSAStartup(MAKEWORD(2,2), &srodowisko) != 0) abort();
  218.  komunikacja = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  219.  if (komunikacja == INVALID_SOCKET) abort();
  220.  printf("\nOtwarcie komunikacji nadrzednej w srodowisku: %s\n", srodowisko.szDescription);
  221.  
  222.  // powiazanie gniazda ze lokalna maszyna do odbioru komunikatow z dowolnego adresu poprzez podany port:
  223.  lokalny.sin_family = AF_INET;
  224.  lokalny.sin_addr.s_addr = INADDR_ANY;
  225.  lokalny.sin_port = htons(port);
  226.  if (bind(komunikacja, (const sockaddr *)&lokalny, sizeof lokalny) == SOCKET_ERROR)
  227.  printf("Lokalny port (%hu) zajety, odbior komunikatow domyslny!\n", port);
  228.  else printf("Odbior komunikatow ze sieci na lokalnym porcie: %hu\n", port);
  229.  
  230.  // przetwarzanie komunikatow i wymiana znakow w sieci:
  231.  printf("Rozpowszechnianie komunikatow w sieci...");
  232.  {
  233.   rozpowszechnianie = TRUE;
  234.   dowolny.sin_family = lokalny.sin_family;
  235.   dowolny.sin_addr.s_addr = INADDR_BROADCAST;
  236.   dowolny.sin_port = lokalny.sin_port;
  237.   if (setsockopt(komunikacja, SOL_SOCKET, SO_BROADCAST, (const char*)&rozpowszechnianie, sizeof rozpowszechnianie) == SOCKET_ERROR) abort();
  238.   printf("\n(nacisnij klawisz ESC, aby zakonczyc komunikacje)\n");
  239.   memset(alfabet,cString,sizeof alfabet);
  240.   znaki = -1;
  241.   while (rozpowszechnianie) {
  242.    char znak;
  243.    if (_kbhit() && _getch()==kEscape) znak = cKoniec;
  244.    else if (znaki <= 0) znak = cString;
  245.    else if (++kolumny>nWiersz) {
  246.     znak = cWiersz;
  247.     kolumny = 0;
  248.    } else znak = alfabet[rand()%znaki];
  249.    if (sendto(komunikacja, &znak, 1, 0, (const sockaddr *)&dowolny, sizeof dowolny) <= SOCKET_ERROR) abort();
  250.    if (znaki<0) {
  251.     printf("znaki alfabetu:\n");
  252.     memset(alfabet,cString,sizeof alfabet);
  253.     kolumny = znaki = 0;
  254.    }
  255.    if (znak == cKoniec) rozpowszechnianie = FALSE;
  256.    else {
  257.     if (znaki < nAlfabet) {
  258.      clock_t zwloka = clock()+(clock_t)(0.25*CLOCKS_PER_SEC);
  259.      while (clock()<zwloka);
  260.     }
  261.     bezblokowania = TRUE;
  262.     if (ioctlsocket(komunikacja, FIONBIO, &bezblokowania) == SOCKET_ERROR) abort();
  263.     do {
  264.      rozmiar = sizeof zdalny;
  265.      if (recvfrom(komunikacja, &znak, 1, 0, (sockaddr *)&zdalny, &rozmiar) <= SOCKET_ERROR)
  266.      if (WSAGetLastError() == WSAEWOULDBLOCK) break;
  267.      else abort();
  268.      if (znak == cKoniec) _ungetch(kEscape);
  269.      else if (znaki>0 && znak == cString) znaki = -1;
  270.      else if (znaki<nAlfabet && isalnum(znak)) {
  271.       alfabet[znaki++] = znak;
  272.       printf("{ %s }\n", alfabet);
  273.      }
  274.     } while (true);
  275.     bezblokowania = FALSE;
  276.     if (ioctlsocket(komunikacja, FIONBIO, &bezblokowania) == SOCKET_ERROR) abort();
  277.    }
  278.   }
  279.   if (setsockopt(komunikacja, SOL_SOCKET, SO_BROADCAST, (const char*)&rozpowszechnianie, sizeof rozpowszechnianie) == SOCKET_ERROR) abort();
  280.  }
  281.  
  282.  // zakonczenie komunikacji i zamkniecie srodowiska Winsock:
  283.  closesocket(komunikacja);
  284.  if (WSACleanup()!=0) abort();
  285.  
  286.  system("pause");
  287.  printf("\nKoniec programu.\n");
  288.  return 0;
  289. }
  290.  
  291. WNDCW10b
  292. /**************************************************************************/
  293. /* Komunikacja miedzyprocesowa z uzyciem gniazd typu UDP - modul podlegly */
  294. /**************************************************************************/
  295. /* Niniejszy program stanowi podlegly modul w prostym systemie sieciowym.
  296.  * Program tworzy gniazdo typu UDP i oczekujac odbiera zdalne komunikaty znakowe  
  297.  * od sieci na danym porcie maszyny lokalnej, z ktorych tworzy tekst w strumieniu
  298.  * wyjsciowym. Jednoczesnie program odczytuje pojednyncze znaki wprowadzone lokalnie
  299.  * do strumienia wejsciowego i nastepnie wysyla je zwrotnie pod zdalny adres.
  300.  */
  301.  
  302. // dodatkowa konfiguracja dla kompilatora MSVC
  303. #pragma warning(disable:4244)
  304. #pragma warning(disable:4996 4005)
  305. #define _CRT_SECURE_NO_WARNINGS
  306. #define _USE_MATH_DEFINES
  307. #ifdef UNICODE
  308. # undef UNICODE
  309. # define _MBCS
  310. #endif
  311.  
  312. // pliki naglowkowe standardu C++ oraz interfejsu Win32API:
  313. #include <cstdio>
  314. #include <cstdlib>
  315. #include <cstring>
  316. using namespace std;
  317. #include <conio.h>
  318. #include <winsock2.h>
  319.  
  320. // dodatkowa konfiguracja dla linkera MSVC
  321. #pragma comment(lib, "ws2_32.lib")
  322.  
  323. // glowne parametry programu:
  324. const u_short iPort = 5000;
  325. const char cString = '\0';
  326. const char cKoniec = '\a';
  327. const char kSpacja = ' ';
  328. const char kEscape = '\33';
  329.  
  330. // glowny kod programu:
  331. int main()
  332. {
  333.  printf(">> Poczatek programu <<\n\n");
  334.  
  335.  // pomocnicze zmienne programu:
  336.  WSADATA srodowisko;
  337.  SOCKET komunikacja;
  338.  u_short port;
  339.  sockaddr_in lokalny,zdalny;
  340.  int rozmiar,znaki;
  341.  
  342.  // odczytanie parametrow programu:
  343.  
  344.  printf("Podaj numer portu komunikacyjnego (np. %hu): ", iPort);
  345.  port = iPort;
  346.  scanf("%hu", &port);
  347.  
  348.  // otwarcie srodowiska Winsock 2.2 oraz gniazda do komunikacji typu UDP:
  349.  if (WSAStartup(MAKEWORD(2,2), &srodowisko) != 0) abort();
  350.  komunikacja = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  351.  if (komunikacja == INVALID_SOCKET) abort();
  352.  printf("\nOtwarcie komunikacji podleglej w srodowisku: %s\n", srodowisko.szDescription);
  353.  
  354.  // powiazanie gniazda ze lokalna maszyna do odbioru komunikatow z dowolnego adresu poprzez podany port:
  355.  lokalny.sin_family = AF_INET;
  356.  lokalny.sin_addr.s_addr = INADDR_ANY;
  357.  lokalny.sin_port = htons(port);
  358.  if (bind(komunikacja, (const sockaddr *)&lokalny, sizeof lokalny) == SOCKET_ERROR) abort();
  359.  else printf("Odbior komunikatow ze sieci na lokalnym porcie: %hu\n", port);
  360.  
  361.  // przetwarzanie komunikatow i wymiana znakow w sieci:
  362.  printf("Oczekiwanie na odbior komunikatu...");
  363.  {
  364.   bool poczatek = true;
  365.   bool wtoku = poczatek;
  366.   znaki = -1;
  367.   while (wtoku) {
  368.    char znak = cKoniec;
  369.    rozmiar = sizeof zdalny;
  370.    if (recvfrom(komunikacja, &znak, 1, 0, (sockaddr *)&zdalny, &rozmiar) <= SOCKET_ERROR) abort();
  371.    if (poczatek) {
  372.     printf("\n(nacisnij klawisz, aby wyslac znak alfabetu,\n lub spacje, aby zresetowac alfabet,\n lub ESC, aby zakonczyc komunikacje)\n");
  373.     poczatek = false;
  374.    }
  375.    if (znak == cKoniec) {
  376.     if (znaki>0) printf("\n");
  377.     wtoku = false;
  378.    } else
  379.    if (znak == cString) {
  380.     if (znaki>0) {
  381.      printf("\n");
  382.      znaki = -1;
  383.     }
  384.     if (znaki<0) {
  385.      printf("znaki tekstu:\n");
  386.      znaki = 0;
  387.     }
  388.    } else {
  389.     putchar(znak);
  390.     znaki++;
  391.    }
  392.    if (_kbhit() && wtoku) {
  393.     znak = _getch();
  394.     if (znak == kEscape) znak = cKoniec;
  395.     else if (znak == kSpacja) znak = cString;
  396.     if (sendto(komunikacja, &znak, 1, 0, (const sockaddr *)&zdalny, sizeof zdalny) <= SOCKET_ERROR) abort();
  397.    }
  398.   }
  399.  }
  400.  
  401.  // zakonczenie komunikacji i zamkniecie srodowiska Winsock:
  402.  closesocket(komunikacja);
  403.  if (WSACleanup()!=0) abort();
  404.  
  405.  system("pause");
  406.  printf("\nKoniec programu.\n");
  407.  return 0;
  408. }
  409.  
  410. WNDCW11b
  411. /**********************************************************************************************/
  412. /* Obliczenia rozproszone w wielomaszynowym klastrze z komunikacja typu UDP - modul nadrzedny */
  413. /**********************************************************************************************/
  414. /* Niniejszy program stanowi nadrzedny wezel (ang. master node) w klastrze maszyn.
  415.  * Program tworzy gniazdo typu UDP i wysyla komunikat z argumentami obliczen do sieci
  416.  * na danym porcie, obierany przez maszyny zdalne. Nastepnie program odbiera komunikaty
  417.  * z czastkowymi wynikami obliczen i otrzymuje wynik bedacy calka pewnego wyrazenia.
  418.  */
  419.  
  420. // dodatkowa konfiguracja dla kompilatora MSVC
  421. #pragma warning(disable:4244)
  422. #pragma warning(disable:4996 4005)
  423. #define _CRT_SECURE_NO_WARNINGS
  424. #define _USE_MATH_DEFINES
  425. #ifdef UNICODE
  426. # undef UNICODE
  427. # define _MBCS
  428. #endif
  429.  
  430. // pliki naglowkowe standardu C++ oraz interfejsu Win32API:
  431. #include <cstdio>
  432. #include <cstdlib>
  433. #include <cstring>
  434. using namespace std;
  435. #include <winsock2.h>
  436.  
  437. // dodatkowa konfiguracja dla linkera MSVC
  438. #pragma comment(lib, "ws2_32.lib")
  439.  
  440. // glowne parametry programu:
  441. const char sAdres[] = "localhost";
  442. const u_short iPort = 5000;
  443. const char cSygnal = '\a';
  444. const char cRekord = '\n';
  445. const char cString = '\0';
  446. const size_t nKlaster = 100;
  447. const size_t nOpis = 256;
  448. const size_t nPakiet = 512;
  449. const size_t nRekord = 1024;
  450. const int nCalka = 100000;
  451.  
  452. // glowny kod programu:
  453. int main()
  454. {
  455.  printf(">> Poczatek programu <<\n\n");
  456.  
  457.  // pomocnicze zmienne programu:
  458.  WSADATA srodowisko;
  459.  SOCKET komunikacja;
  460.  u_short port;
  461.  sockaddr_in lokalny,dowolny,zdalny;
  462.  char adresy[nKlaster][nOpis];
  463.  sockaddr_in klaster[nKlaster];
  464.  int rozmiar,wezel,wezly;
  465.  BOOL rozpoznanie;
  466.  
  467.  // odczytanie parametrow programu:
  468.  
  469.  printf("Podaj numer portu komunikacyjnego (np. %hu): ", iPort);
  470.  port = iPort;
  471.  scanf("%hu", &port);
  472.  
  473.  printf("Podaj liczbe wszystkich wezlow klastera (<= %u): ", nKlaster);
  474.  wezly = nKlaster;
  475.  scanf("%u", &wezly);
  476.  
  477.  printf("Czy adresy zdalnych wezlow maja byc rozpoznane (0/1)? ");
  478.  rozpoznanie = FALSE;
  479.  scanf("%d", &rozpoznanie);
  480.  
  481.  // odczytanie adresow wezlow w klasterze:
  482.  for (wezel=0; wezel<wezly; wezel++)
  483.  strcpy(adresy[wezel], sAdres);
  484.  if (!rozpoznanie) {
  485.   printf("Podaj adresy zdalnych wezlow klastera (np. %s):\n", sAdres);
  486.   for (wezel=1; wezel<wezly; wezel++) {
  487.    printf("%d) ", wezel);
  488.    scanf("%s", adresy[wezel]);
  489.   }
  490.  }
  491.  
  492.  // otwarcie srodowiska Winsock 2.2 oraz gniazda do komunikacji typu UDP:
  493.  if (WSAStartup(MAKEWORD(2,2), &srodowisko) != 0) abort();
  494.  komunikacja = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  495.  if (komunikacja == INVALID_SOCKET) abort();
  496.  printf("\nOtwarcie komunikacji dla wezla MASTER w srodowisku: %s\n", srodowisko.szDescription);
  497.  {
  498.   char nazwa[nOpis];
  499.   if (gethostname(nazwa, sizeof nazwa)!=SOCKET_ERROR) {
  500.    hostent *maszyna = gethostbyname(nazwa);
  501.    if (maszyna!=NULL) {
  502.     in_addr adres;
  503.     memcpy(&adres, maszyna->h_addr, maszyna->h_length);
  504.     printf("adres wezla: %s\n", inet_ntoa(adres));
  505.     printf("nazwa wezla: %s\n", maszyna->h_name);
  506.     for (wezel=0; wezel<wezly; wezel++)
  507.     if (strcmp(adresy[wezel], sAdres) == 0)
  508.     strcpy(adresy[wezel], inet_ntoa(adres));
  509.    }
  510.   }
  511.  }
  512.  
  513.  // powiazanie gniazda ze lokalna maszyna do odbioru komunikatow z dowolnego adresu poprzez podany port:
  514.  lokalny.sin_family = AF_INET;
  515.  lokalny.sin_addr.s_addr = INADDR_ANY;
  516.  lokalny.sin_port = htons(port);
  517.  if (bind(komunikacja, (const sockaddr *)&lokalny, sizeof lokalny) == SOCKET_ERROR)
  518.  printf("Lokalny port (%hu) zajety, odbior komunikatow domyslny!\n", port);
  519.  else printf("Odbior komunikatow ze sieci na lokalnym porcie: %hu\n", port);
  520.  
  521.  // rozpoznanie adresow zdalnych maszyn klastera w sieci poprzez rozpowszechnianie komunikatow do dowolnych adresow:
  522.  if (rozpoznanie) {
  523.   char znak = cSygnal;
  524.   printf("Rozpoznawanie wezlow zdalnych w sieci...");
  525.   dowolny.sin_family = lokalny.sin_family;
  526.   dowolny.sin_addr.s_addr = INADDR_BROADCAST;
  527.   dowolny.sin_port = lokalny.sin_port;
  528.   if (setsockopt(komunikacja, SOL_SOCKET, SO_BROADCAST, (const char*)&rozpoznanie, sizeof rozpoznanie) == SOCKET_ERROR) abort();
  529.   printf("\n");
  530.   if (sendto(komunikacja, &znak, 1, 0, (const sockaddr *)&dowolny, sizeof dowolny) <= SOCKET_ERROR) abort();
  531.   for (wezel=1; wezel<wezly; wezel++) {
  532.    do {
  533.     rozmiar = sizeof zdalny;
  534.     if (recvfrom(komunikacja, &znak, 1, 0, (sockaddr *)&zdalny, &rozmiar) <= SOCKET_ERROR) abort();
  535.    } while (znak!=cSygnal);
  536.    strcpy(adresy[wezel], inet_ntoa(zdalny.sin_addr));
  537.   }
  538.   rozpoznanie = FALSE;
  539.   if (setsockopt(komunikacja, SOL_SOCKET, SO_BROADCAST, (const char*)&rozpoznanie, sizeof rozpoznanie) == SOCKET_ERROR) abort();
  540.  }
  541.  
  542.   // ustawienie adresow wszystkich wezlow klastera na potrzeby komunikacji przez podany port:
  543.  for (wezel=0; wezel<wezly; wezel++) {
  544.   klaster[wezel].sin_family = lokalny.sin_family;
  545.   klaster[wezel].sin_addr.s_addr = inet_addr(adresy[wezel]);
  546.   klaster[wezel].sin_port = lokalny.sin_port;
  547.   if (klaster[wezel].sin_addr.s_addr == INADDR_NONE) {
  548.    hostent *maszyna = gethostbyname(adresy[wezel]);
  549.    if (maszyna == NULL) abort();
  550.    memcpy(&klaster[wezel].sin_addr, maszyna->h_addr, maszyna->h_length);
  551.   }
  552.  }
  553.  printf("Wszystkie komunikacyjne wezly w klasterze:\n");
  554.  for (wezel=0; wezel<wezly; wezel++) {
  555.   printf("%d) %s:%hu", wezel, inet_ntoa(klaster[wezel].sin_addr), ntohs(klaster[wezel].sin_port));
  556.   if (wezel==0) printf(" (master)\n");
  557.   else printf("\n");
  558.  }
  559.  
  560.  // przetwarzanie komunikatow i wymiana danych w klasterze:
  561.  printf("Przekazywanie komunikatow w sieci...");
  562.  {
  563.   char pakiet[nPakiet] = {cString};
  564.   char rekord[nRekord] = {cString};
  565.   int zwrot,wszystko,pozostale;
  566.   double wynik,suma = 0.0;
  567.   for (wezel=1; wezel<wezly; wezel++) {
  568.    int N = nCalka;
  569.    int n = wezly-1;
  570.    int i1 = (wezel-1)*N/n;
  571.    int i2 = wezel*N/n-1;
  572.    if (wezel==n) i2 = N;
  573.    sprintf(pakiet,"(%d,%d)",i1,i2);
  574.    wszystko = strlen(pakiet);
  575.    zwrot = sendto(komunikacja, pakiet, wszystko, 0, (const sockaddr *)&klaster[wezel], sizeof klaster[wezel]);
  576.    if (zwrot <= SOCKET_ERROR) abort();
  577.    else if (zwrot < wszystko) break;
  578.   }
  579.   printf("\n");
  580.   if (wezel >= wezly) {
  581.    printf("Wyslano %d bajtowy pakiet komunikatu, oczekiwanie na odbior danych...\n", zwrot);
  582.    for (wezel=1; wezel<wezly; wezel++) {
  583.     wszystko = 0;
  584.     pozostale = nRekord;
  585.     do {
  586.      rozmiar = sizeof zdalny;
  587.      zwrot = recvfrom(komunikacja, &rekord[wszystko], pozostale, 0, (sockaddr *)&zdalny, &rozmiar);
  588.      if (zwrot == 0) break;
  589.      else if (zwrot <= SOCKET_ERROR) abort();
  590.      wszystko += zwrot;
  591.      pozostale -= zwrot;
  592.     } while (rekord[wszystko-1]!=cRekord);
  593.     wszystko--;
  594.     rekord[wszystko] = cString;
  595.     printf("Otrzymano %d bajtowy rekord danych: %s\n", wszystko, rekord);
  596.     if (sscanf(rekord,"wynik = %lf",&wynik) < 1) abort();
  597.     suma+=wynik;
  598.    }
  599.    printf("koncowy wynik obliczen: %f\n", suma);
  600.   }
  601.  }
  602.  
  603.  // zakonczenie komunikacji i zamkniecie srodowiska Winsock:
  604.  closesocket(komunikacja);
  605.  if (WSACleanup()!=0) abort();
  606.  
  607.  system("pause");
  608.  printf("\nKoniec programu.\n");
  609.  return 0;
  610. }
  611.  
  612. WNDCW11b
  613. /*********************************************************************************************/
  614. /* Obliczenia rozproszone w wielomaszynowym klastrze z komunikacja typu UDP - modul podlegly */
  615. /*********************************************************************************************/
  616. /* Niniejszy program stanowi podlegly wezel (ang. slave node) w klastrze maszyn.
  617.  * Program tworzy gniazdo typu UDP i oczekujac odbiera zdalny komunikat z argumentami
  618.  * od sieci na danym porcie maszyny lokalnej. Nastepnie program wysyla pod zdalny adres
  619.  * komunikat z czastkowym wynikiem obliczen.
  620.  */
  621.  
  622. // dodatkowa konfiguracja dla kompilatora MSVC
  623. #pragma warning(disable:4244)
  624. #pragma warning(disable:4996 4005)
  625. #define _CRT_SECURE_NO_WARNINGS
  626. #define _USE_MATH_DEFINES
  627. #ifdef UNICODE
  628. # undef UNICODE
  629. # define _MBCS
  630. #endif
  631.  
  632. // pliki naglowkowe standardu C++ oraz interfejsu Win32API:
  633. #include <cstdio>
  634. #include <cstdlib>
  635. #include <cstring>
  636. #include <cmath>
  637. using namespace std;
  638. #include <winsock2.h>
  639.  
  640. // dodatkowa konfiguracja dla linkera MSVC
  641. #pragma comment(lib, "ws2_32.lib")
  642.  
  643. // glowne parametry programu:
  644. const u_short iPort = 5000;
  645. const char cSygnal = '\a';
  646. const char cRekord = '\n';
  647. const char cString = '\0';
  648. const size_t nOpis = 256;
  649. const size_t nPakiet = 512;
  650. const size_t nRekord = 1024;
  651. const double aCalka = 0.0;
  652. const double bCalka = 1.0;
  653. const int nCalka = 100000;
  654.  
  655. // glowny kod programu:
  656. int main()
  657. {
  658.  printf(">> Poczatek programu <<\n\n");
  659.  
  660.  // pomocnicze zmienne programu:
  661.  WSADATA srodowisko;
  662.  SOCKET komunikacja;
  663.  u_short port;
  664.  sockaddr_in lokalny,zdalny;
  665.  int rozmiar;
  666.  
  667.  // odczytanie parametrow programu:
  668.  
  669.  printf("Podaj numer portu komunikacyjnego (np. %hu): ", iPort);
  670.  port = iPort;
  671.  scanf("%hu", &port);
  672.  
  673.  // otwarcie srodowiska Winsock 2.2 oraz gniazda do komunikacji typu UDP:
  674.  if (WSAStartup(MAKEWORD(2,2), &srodowisko) != 0) abort();
  675.  komunikacja = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  676.  if (komunikacja == INVALID_SOCKET) abort();
  677.  printf("\nOtwarcie komunikacji dla wezla SLAVE w srodowisku: %s\n", srodowisko.szDescription);
  678.  {
  679.   char nazwa[nOpis];
  680.   if (gethostname(nazwa, sizeof nazwa)!=SOCKET_ERROR) {
  681.    hostent *maszyna = gethostbyname(nazwa);
  682.    if (maszyna!=NULL) {
  683.     in_addr adres;
  684.     memcpy(&adres, maszyna->h_addr, maszyna->h_length);
  685.     printf("adres wezla: %s\n", inet_ntoa(adres));
  686.     printf("nazwa wezla: %s\n", maszyna->h_name);
  687.    }
  688.   }
  689.  }
  690.  
  691.  // powiazanie gniazda ze lokalna maszyna do odbioru komunikatow z dowolnego adresu poprzez podany port:
  692.  lokalny.sin_family = AF_INET;
  693.  lokalny.sin_addr.s_addr = INADDR_ANY;
  694.  lokalny.sin_port = htons(port);
  695.  if (bind(komunikacja, (const sockaddr *)&lokalny, sizeof lokalny) == SOCKET_ERROR) abort();
  696.  else printf("Odbior komunikatow ze sieci na lokalnym porcie: %hu\n", port);
  697.  
  698.  // przetwarzanie komunikatow i wymiana danych w klasterze:
  699.  printf("Oczekiwanie na odbior komunikatu...");
  700.  {
  701.   char pakiet[nPakiet] = {cString};
  702.   char rekord[nRekord] = {cString};
  703.   int zwrot,wszystko,biezacy;
  704.   double argument,wynik = 0.0;
  705.   rozmiar = sizeof zdalny;
  706.   zwrot = recvfrom(komunikacja, pakiet, nPakiet, 0, (sockaddr *)&zdalny, &rozmiar);
  707.   printf("\n");
  708.   if (zwrot <= SOCKET_ERROR) abort();
  709.   else if (zwrot > 0) {
  710.    pakiet[zwrot] = cString;
  711.    if (strlen(pakiet)==1 && pakiet[0]==cSygnal) {
  712.     printf("Przetwarzanie komunikatu rozpoznawania...\n");
  713.     if (sendto(komunikacja, pakiet, 1, 0, (const sockaddr *)&zdalny, rozmiar) <= SOCKET_ERROR) abort();
  714.     rozmiar = sizeof zdalny;
  715.     zwrot = recvfrom(komunikacja, pakiet, nPakiet, 0, (sockaddr *)&zdalny, &rozmiar);
  716.     if (zwrot <= SOCKET_ERROR) abort();
  717.     else if (zwrot > 0) pakiet[zwrot] = cString;
  718.    }
  719.   }
  720.   if (zwrot > 0) {
  721.    int i1,i2,i;
  722.    printf("Odebrano %d bajtowy pakiet komunikatu: %s\n", zwrot, pakiet);
  723.    if (sscanf(pakiet, "(%d,%d)", &i1, &i2) < 2) abort();
  724.    for (i=i1;i<=i2;i++) {
  725.     double a = aCalka;
  726.     double b = bCalka;
  727.     int N = nCalka;
  728.     double d = (b-a)/N;
  729.     argument = a+i*d;
  730.     wynik += tanh(argument)/sqrt(argument*argument+exp(sin(argument)*cos(argument)));
  731.    }
  732.    sprintf(rekord, "wynik = %f%c", wynik, cRekord);
  733.    wszystko = strlen(rekord);
  734.    biezacy = 0;
  735.    printf("Wysylanie %d bajtowy rekord danych...\n", (wszystko-1));
  736.    while (wszystko > 0) {
  737.     zwrot = sendto(komunikacja, &rekord[biezacy], wszystko, 0, (sockaddr *)&zdalny, sizeof zdalny);
  738.     if (zwrot == 0) break;
  739.     else if (zwrot <= SOCKET_ERROR) abort();
  740.     wszystko -= zwrot;
  741.     biezacy += zwrot;
  742.    }
  743.   }
  744.  }
  745.  
  746.  // zakonczenie komunikacji i zamkniecie srodowiska Winsock:
  747.  closesocket(komunikacja);
  748.  if (WSACleanup()!=0) abort();
  749.  
  750.  system("pause");
  751.  printf("\nKoniec programu.\n");
  752.  return 0;
  753. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement