All pastes #492733 Raw Edit

Someone

public text v1 · immutable
·published 2007-05-17 11:47 UTC
rendered paste body
/******************************************************************
  Grafika komputerowa, środowisko MS Windows - program  przykładowy
 *****************************************************************/


#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include "inet.h"
#include "common.h"
#include "network.h"
#include "logic.h"
#define MAXSIZE 512

int psi, teta, stan=0;
char odbiorcza[250],wysylajaca[250];
struct sockaddr_in sock_in;
int rozmiar;
SOCKET nasluchujacy, polaczony;

char **board2buf(int board[SIZE][SIZE])
{
  int i,j;
  char **buf = malloc(SIZE * sizeof(char *));
    for (i = 0; i < SIZE; i++)
    buf[i] = malloc((SIZE + 2) * sizeof(char));
    for(i = 0; i < SIZE; i++)
    {
      for (j = 0; j < SIZE; j++)
      {
        // Coordinates alternation
        buf[i][j] = board[j][i] + '0';
      }
      buf[i][SIZE] = '\n';
      buf[i][SIZE+1] = '\0';
    }

  return buf;
}

void senddata(int sockfd, int code, char **buf)
{
  char  out[MAXSIZE];
  int   i, n;

  if (code == rp_ok)
  {
    sprintf(out, "1\n");
    for (i = 0; i < SIZE; i++)
    {
      strcat(out, buf[i]);
    }
  }
  else
  {
    sprintf(out, "0\n");
  }

  fprintf(stderr, "Sending: %s", out);
  n = strlen(out);
  if (writen(sockfd, out, n) != n)
    fprintf(stderr, "str_echo: writen error\n");
}
//deklaracja funkcji obslugi okna
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

//funkcja Main - dla Windows
int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR     lpCmdLine,
    int       nCmdShow)
{
  MSG meldunek;        //innymi slowy "komunikat"
  WNDCLASS nasza_klasa; //klasa g&#322;ównego okna aplikacji
  HWND okno;
  static char nazwa_klasy[] = "Podstawowa";

  wysylajaca[0]=1;
  for(psi=0; psi<8; psi++)
  {
    for(teta=0; teta<8; teta++) board[psi][teta]=0;
  }
  init();
  //Definiujemy klase g&#322;ównego okna aplikacji
  //Okreslamy tu wlasciwosci okna, szczegoly wygladu oraz
  //adres funkcji przetwarzajacej komunikaty
  nasza_klasa.style         = CS_HREDRAW | CS_VREDRAW;
  nasza_klasa.lpfnWndProc   = WndProc; //adres funkcji realizuj&#261;cej przetwarzanie meldunków
  nasza_klasa.cbClsExtra    = 0 ;
  nasza_klasa.cbWndExtra    = 0 ;
  nasza_klasa.hInstance     = hInstance; //identyfikator procesu przekazany przez MS Windows podczas uruchamiania programu
  nasza_klasa.hIcon         = 0;
  nasza_klasa.hCursor       = LoadCursor(0, IDC_ARROW);
  nasza_klasa.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
  nasza_klasa.lpszMenuName  = "Menu" ;
  nasza_klasa.lpszClassName = nazwa_klasy;

  //teraz rejestrujemy klas&#281; okna g&#322;ównego
  RegisterClass (&nasza_klasa);

  /*tworzymy okno g&#322;ówne
    okno b&#281;dzie mia&#322;o zmienne rozmiary, listw&#281; z tytu&#322;em, menu systemowym
    i przyciskami do zwijania do ikony i rozwijania na ca&#322;y ekran, po utworzeniu
    b&#281;dzie widoczne na ekranie */
  okno = CreateWindow(nazwa_klasy, "Reversi (serv)", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
      CW_USEDEFAULT, WS_MAXIMIZE, 410, 435, NULL, NULL, hInstance, NULL);


  /* wybór rozmiaru i usytuowania okna pozostawiamy systemowi MS Windows */
  ShowWindow (okno, SW_SHOW) ;

  //odswiezamy zawartosc okna
  UpdateWindow (okno) ;

  /** Start winsocketow ************************/
  int blad;
  WORD wersja;
  WSADATA wsaData;
  wersja = MAKEWORD( 2, 0 );
  blad = WSAStartup(wersja, &wsaData );

  if ( blad != 0 )
  {
    MessageBox(okno,"error WSA","ERROR",MB_OK);
    WSACleanup();
  }

  if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 )
  {
    MessageBox(okno,"error z&#322;a wersja winsocket","ERROR",MB_OK);
    WSACleanup();
  }
  nasluchujacy =  socket( AF_INET, SOCK_STREAM, 0 );
  /** Serwer ***********************************/

  memset( &sock_in, 0, sizeof(sock_in) );
  sock_in.sin_family = AF_INET;
  sock_in.sin_addr.s_addr = INADDR_ANY;
  sock_in.sin_port = htons(SERV_TCP_PORT);

  rozmiar = sizeof(sock_in);

  if ( bind(nasluchujacy,(struct sockaddr *)&sock_in, sizeof(sock_in)) == SOCKET_ERROR )
  {
    MessageBox(okno,"bind - b&#322;&#261;d","b&#322;&#261;d",MB_OK);
    WSACleanup();
  }
  else
  {
    //MessageBox(okno,"bind - dobrze!","b&#322;&#261;d",MB_OK);
    // WSACleanup();
  }

  if (listen(nasluchujacy,SOMAXCONN)==SOCKET_ERROR)
  {
    MessageBox(okno,"error listen","ERROR",MB_OK);
    WSACleanup();
  }
  else
  {
    //MessageBox(okno,"liten - dobrze!","b&#322;&#261;d",MB_OK);
    // WSACleanup();
  }

  WSAAsyncSelect(nasluchujacy,okno,WM_USER,FD_ACCEPT|FD_CONNECT|FD_READ);
  // G&#321;ÓWNA P&#280;TLA PROGRAMU
  while (GetMessage(&meldunek, NULL, 0, 0))
    /* pobranie komunikatu z kolejki; funkcja GetMessage zwraca FALSE tylko dla
       komunikatu wm_Quit; dla wszystkich pozosta&#322;ych komunikatów zwraca warto&#347;&#263; TRUE */
  {
    TranslateMessage(&meldunek); // wst&#281;pna obróbka komunikatu
    DispatchMessage(&meldunek);  // przekazanie komunikatu w&#322;a&#347;ciwemu adresatowi (czyli funkcji obslugujacej odpowiednie okno)
  }
  return (int)meldunek.wParam;
}



/********************************************************************
  FUNKCJA OKNA realizujaca przetwarzanie meldunków kierowanych do okna aplikacji*/
LRESULT CALLBACK WndProc (HWND okno, UINT kod_meldunku, WPARAM wParam, LPARAM lParam)
{
  POINT twoj_stary[2];

  /* PONI&#379;SZA INSTRUKCJA DEFINIUJE REAKCJE APLIKACJI NA POSZCZEGÓLNE MELDUNKI */
  switch (kod_meldunku)
  {
    case WM_LBUTTONDOWN: //reakcja na lewy przycisk myszki
      {
        int x = LOWORD(lParam);
        int y = HIWORD(lParam);
        int n;

        x/=50;
        y/=50;
        //check(x,y,tl_black);
        //if(board[x][y]==tl_blank)board[x][y]=tl_black;
        if(place(x,y,tl_black))
        {
          senddata(polaczony, rp_ok, board2buf(board));
        }
        /*if(place(x,y,tl_black))
          {
          n=2;
          wysylajaca[0]='1';
          wysylajaca[1]='\n';

          for (int i = 0; i < SIZE; i++)
          {
          for (int j = 0; j < SIZE; j++)
          {
          wysylajaca[n++]=board[j][i] + '0';
          }
          wysylajaca[n++]='\n';
          }
          wysylajaca[n]='\0';
          send(polaczony,wysylajaca,sizeof(n),0);
          }*/
        InvalidateRect(okno, NULL, FALSE); //od&#378;wie&#380;anie
        return 0;
/*
        DeleteObject(wypelnienie2);
        DeleteObject(wypelnienie);
*/



/*
        EndPaint(okno, &paint);
*/

        return 0;
      }

    case WM_DESTROY: //obowi&#261;zkowa obs&#322;uga meldunku o zamkni&#281;ciu okna
      closesocket(polaczony);
      closesocket(nasluchujacy);
      WSACleanup();
      PostQuitMessage (0) ;
      return 0;

    case WM_USER:
      {
        switch (WSAGETSELECTEVENT(lParam))
        {
          case FD_ACCEPT:
            polaczony = accept(nasluchujacy,(struct sockaddr *)&sock_in, &rozmiar);
            break;

          case FD_READ:
            recv(polaczony,odbiorcza,sizeof(odbiorcza),0);
            if(stan==0 && odbiorcza[0]==rq_init)
            {
              init();
              send(polaczony,wysylajaca,sizeof(wysylajaca),0);
              odbiorcza[0]==5;
              stan=1;
            }

            break;

          case FD_CONNECT:
            MessageBox(okno,"po&#322;&#261;czono","connect",MB_OK);
            break;

          case FD_WRITE:   
            break;
        }
        return 0;
      }

    default: //standardowa obs&#322;uga pozosta&#322;ych meldunków
      return DefWindowProc(okno, kod_meldunku, wParam, lParam);
  }
}