All pastes #492705 Raw Edit

winserver

public cpp v1 · immutable
·published 2007-05-17 11:12 UTC
rendered paste body
/****************************************************************** Grafika komputerowa, &#347;rodowisko MS Windows - program  przyk&#322;adowy *****************************************************************/#include <string.h>#include <stdlib.h>#define WIN32_LEAN_AND_MEAN#include <windows.h>#include "inet.h"#include "common.h"#include "network.h"#include "logic.h"#define MAXSIZE 512int psi, teta, stan=0;char odbiorcza[250],wysylajaca[250];struct sockaddr_in sin;int rozmiar;SOCKET nasluchujacy, polaczony;char **board2buf(int board[SIZE][SIZE]){  /*char **buf = malloc(SIZE * sizeof(char *));  for (int i = 0; i < SIZE; i++)    buf[i] = malloc((SIZE + 2) * sizeof(char));*/  char **buf  for(int i = 0; i < SIZE; i++)  {    for (int 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	n;  if (code == rp_ok)  {    sprintf(out, "1\n");    for (int 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 oknaLRESULT 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( &sin, 0, sizeof(sin) );	sin.sin_family = AF_INET;	sin.sin_addr.s_addr = INADDR_ANY;	sin.sin_port = htons(SERV_TCP_PORT);		rozmiar = sizeof(sin);	if ( bind(nasluchujacy,(struct sockaddr *)&sin, sizeof(sin)) == 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;		}	//case WM_RBUTTONDOWN: //reakcja na prawy przycisk myszy		//{		//	int x = LOWORD(lParam);		//	int y = HIWORD(lParam);								//	if(n<100)		//	{		//		tablica[0][n]=x;		//		tablica[1][n]=y;		//		tablica[2][n]=kolor;		//		tablica[3][n]=obrot;		//		InvalidateRect(okno, NULL, FALSE);		//		n++;		//	}		//	return 0;	//	}		case WM_PAINT:		{			PAINTSTRUCT paint;			HDC kontekst;			kontekst = BeginPaint(okno, &paint);			int j;			/*************** Rysuj kratke ***********************************/				HPEN kreska = CreatePen(PS_SOLID, 1, RGB(0,0,0));				for(j=0; j<SIZE; j++)				{					SelectObject(kontekst, kreska);					MoveToEx(kontekst, j*50,0, twoj_stary);					LineTo(kontekst, j*50,400);					MoveToEx(kontekst, 0, j*50, twoj_stary);					LineTo(kontekst, 400, j*50);				}				DeleteObject(kreska);								HBRUSH wypelnienie2 = CreateSolidBrush(RGB(0,0,0));					HBRUSH wypelnienie = CreateSolidBrush(RGB(255,255,255));				HPEN	obramowanie = CreatePen(PS_SOLID,2, RGB(0,0,0));				for(psi=0; psi<8; psi++)				{					for(teta=0; teta<8; teta++)					{						if(board[psi][teta]==tl_white)						{/***********************	Bialy kapsel *************************************/							SelectObject(kontekst, obramowanie);							SelectObject(kontekst, wypelnienie);							Ellipse(kontekst, 3 + 50*psi, 3 + 50*teta, 48 + 50*psi, 48 + 50*teta);										}						else if(board[psi][teta]==tl_black)						{/************************	Czarny kapsel *************************************/							SelectObject(kontekst, wypelnienie2);							Ellipse(kontekst, 3 + 50*psi, 3 + 50*teta, 48 + 50*psi, 48 + 50*teta);						}					}				}				DeleteObject(obramowanie);				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 *)&sin, &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);	}}