Anteprima
Vedrai una selezione di 1 pagina su 4
MisterMind esempio Client Pag. 1
1 su 4
Disdici quando vuoi 162x117
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Sintesi
Classico gioco del mastermind fatto in c++ ottimo esempio x vedere la comunicazione di un client con un server.
Estratto del documento

#include <stdio.h>

#include <string.h>

#include <winsock.h>

#define PORT 6644

#define VITTORIA "Complimenti hai vinto !!XD\0"

#define SCONFITTA "Complimenti hai PERSO !!XD\0"

#define MAX_STRING 256

void client(char *);

void error(char *);

int InitializeWinsock(WORD );

void Usage();

int main(int argc, char *argv[]) {

if ( argc < 2 ) Usage();

if (!InitializeWinsock (MAKEWORD(1,1) ) ) return 1;

client(argv[1]);

WSACleanup();

return 0;

}

void client(char * server_IP) {

SOCKET fd; // "file" descriptor for the network socket

SOCKADDR_IN saddr;

char buf[MAX_STRING];

if ((fd=socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)

error("Client: socket not connected ");

saddr.sin_family = AF_INET;

saddr.sin_addr.s_addr = inet_addr(server_IP);

saddr.sin_port = htons(PORT);

// request connection to server socket (remote machine)

if (connect(fd, (LPSOCKADDR) &saddr, sizeof(saddr)) == SOCKET_ERROR)

error("Client: connect ");

//Riceviamo il messaggio di benvenuto

if ( recv(fd, buf, sizeof(buf), 0) == SOCKET_ERROR )

error("Client: receiving failure ");

printf("%s\n",buf);

while (1) {

//ricevo dal server il numero del tentativo

if ( recv(fd, buf, sizeof(buf), 0) == SOCKET_ERROR )

error("Client: receiving failure ");

printf("%s\n",buf);

//dobbiamo uscire se il buf contiene il messaggio di vittoria o

sconfitta esco

if (strstr(buf,VITTORIA)||strstr(buf,SCONFITTA))

break;

//leggo il tentativo

scanf("%s",buf);

//invio il tentativo al server.

if ( send(fd,buf, strlen(buf)+1, 0) == SOCKET_ERROR )

error("Client: sending failure ");

//ricevo la risposta

if ( recv(fd, buf, sizeof(buf), 0) == SOCKET_ERROR )

error("Client: receiving failure ");

printf("%s\n",buf);

}

if (closesocket(fd) == SOCKET_ERROR)

error("Client: closing socket ");

getchar();

}

/**********************************************

* Windows Sockets Initialization *

**********************************************/

int InitializeWinsock(WORD wVersionRequested) {

WSADATA wsaData;

int err;

err = WSAStartup(wVersionRequested, &wsaData);

// ritorna errore se, ad esempio, l'applicazione supporta al massimo

// la versione 1.1 e la DLL supporta da 2.0 in su (le versioni non si

sovrappongono)

if (err!=0) return 0; // Tell the user that we couldn't find a usable

winsock.dll

// WSAStartup returns in wHighVersion (struct wsaData) the highest version

it supports

// and in wVersion the minimum of its high version and wVersionRequested.

// wVersion is the The version of the Windows Sockets specification

// that the Windows Sockets DLL expects the caller to use.

// Se WSAStartup ritorna un risultato accettabile, l'applicazione deve

ancora

// verificare che il risultato sia compatibile con la sua richiesta. Ad

esempio,

// con wVersionRequested=1.1 e DLL version 1.0, wVersion=1.0. Se

l'applicazione

// vuole assolutamente usare la DLL 1.1, deve ancora verificare di non

trovarsi

// in questo caso

// Tell the user that we couldn't find a usable winsock.dll.

if (LOBYTE(wsaData.wVersion )!=1 || HIBYTE(wsaData.wVersion)!=1) return 0;

//Everything is fine: proceed

return 1;

}

/**********************************************

* Error Handling Functions *

**********************************************/

void Usage() {

printf("\n\t Usage: Client ip_server_address\n\n");

exit(1);

}

// define to save space

#define PERR(X) fprintf(stderr, X); break

void error(char* string) {

int err;

fprintf(stderr, "%s", string);

err= WSAGetLastError();

//in Windows, gli errori dovuti ai sockets sono mappati oltre 10000

switch (err) {

case WSANOTINITIALISED:

PERR("A successful WSAStartup() must occur before using this API.");

case WSAENETDOWN:

PERR("The Windows Sockets implementation has detected that the network

subsystem has failed.");

case WSAEAFNOSUPPORT:

PERR("The specified address family is not supported.");

case WSAEINPROGRESS:

PERR("A blocking Windows Sockets operation is in progress.");

case WSAEMFILE:

PERR("No more file descriptors are available.");

case WSAENOBUFS:

PERR("No buffer space is available. The socket cannot be created.");

case WSAEPROTONOSUPPORT:

PERR("The specified protocol is not supported.");

case WSAEPROTOTYPE:

PERR("The specified protocol is the wrong type for this socket.");

case WSAESOCKTNOSUPPORT:

PERR("The specified socket type is not supported in this address

family.");

case WSAEADDRINUSE:

PERR("The specified address is already in use. (See setsockopt()

SO_REUSEADDR option)");

case WSAEFAULT:

PERR("The namelen argument is too small (less than the size of a struct

sockaddr).");

case WSAEINTR:

PERR("The (blocking) call was canceled via WSACancelBlockingCall()");

case WSAEINVAL:

PERR("The socket is already bound to an address.");

case WSAENOTSOCK:

PERR("The descriptor is not a socket.");

case WSAEADDRNOTAVAIL:

PERR("Address not availabile");

case WSAEISCONN:

PERR("The socket is already connected.");

case WSAEOPNOTSUPP:

PERR("The referenced socket is not of a type that supports the listen()

operation.");

case WSAEWOULDBLOCK:

PERR("The socket is marked as non-blocking and no connections are

present to be accepted.");

case WSAECONNREFUSED:

PERR("The attempt to connect was forcefully rejected.");

case WSAEDESTADDRREQ:

PERR("A destination address is required.");

case WSAENETUNREACH:

PERR("The network can't be reached from this host at this time.");

case WSAETIMEDOUT:

PERR("Attempt to connect timed out without establishing a connection");

case WSAECONNRESET:

PERR("Connection reset");

default:

fprintf(stderr, "Error reported by WSAGetLastError= %d\n Check

winsock.h.\n\n", err);

break;

};

Dettagli
Publisher
4 pagine
20 download