/****************************************************************** Grafika komputerowa, środowisko MS Windows - program przykładowy *****************************************************************/ #include #include #include #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łó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łó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ą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ę okna głównego RegisterClass (&nasza_klasa); /*tworzymy okno główne okno będzie miało zmienne rozmiary, listwę z tytułem, menu systemowym i przyciskami do zwijania do ikony i rozwijania na cały ekran, po utworzeniu bę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ł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łąd","błąd",MB_OK); WSACleanup(); } else { //MessageBox(okno,"bind - dobrze!","błąd",MB_OK); // WSACleanup(); } if (listen(nasluchujacy,SOMAXCONN)==SOCKET_ERROR) { MessageBox(okno,"error listen","ERROR",MB_OK); WSACleanup(); } else { //MessageBox(okno,"liten - dobrze!","błąd",MB_OK); // WSACleanup(); } WSAAsyncSelect(nasluchujacy,okno,WM_USER,FD_ACCEPT|FD_CONNECT|FD_READ); // GŁÓWNA PĘTLA PROGRAMU while (GetMessage(&meldunek, NULL, 0, 0)) /* pobranie komunikatu z kolejki; funkcja GetMessage zwraca FALSE tylko dla komunikatu wm_Quit; dla wszystkich pozostałych komunikatów zwraca wartość TRUE */ { TranslateMessage(&meldunek); // wstępna obróbka komunikatu DispatchMessage(&meldunek); // przekazanie komunikatu właś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Ż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źwieżanie return 0; /* DeleteObject(wypelnienie2); DeleteObject(wypelnienie); */ /* EndPaint(okno, &paint); */ return 0; } case WM_DESTROY: //obowiązkowa obsługa meldunku o zamknię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łączono","connect",MB_OK); break; case FD_WRITE: break; } return 0; } default: //standardowa obsługa pozostałych meldunków return DefWindowProc(okno, kod_meldunku, wParam, lParam); } }