vuoi
o PayPal
tutte le volte che vuoi
#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;
};