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łó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);
}
}