// SERVER

#include <stdio.h>
#include <windows.h>
#include <winsock.h>

#define PORT 4000
#define LBUF 10


SOCKET sock;

SOCKADDR addr;

void MsgProc();

void main()

{

printf("Questo server accetta 5 connessioni sulla porta %d\n",PORT);


// INIZIALIZZO LA STRUTTURA INDICANDO PROTOCOLLO E IP SU DOVE ESEGUIRE
SOCKADDR_IN addr_in;
addr_in.sin_family=AF_INET;
addr_in.sin_port=PORT;
addr_in.sin_addr.S_un.S_un_b.s_b1=127;
addr_in.sin_addr.S_un.S_un_b.s_b2=0;
addr_in.sin_addr.S_un.S_un_b.s_b3=0;
addr_in.sin_addr.S_un.S_un_b.s_b4=1;

memcpy(&addr,&addr_in,sizeof(SOCKADDR_IN));

SOCKET temp=NULL;

// INIZIALIZZO I WINSOCKETS

WSADATA dat;
WORD ver=MAKEWORD(1,1);
int res;

printf("WSAStartup: %d Version %d\n",(res=WSAStartup(ver,&dat)),ver);

if(res!=0)
return;


// SETTO LA CONNESSIONE
sock=socket(PF_INET,SOCK_STREAM,0);

printf("Binding socket: %d\n",bind(sock,&addr,sizeof(addr)));
printf("Listen mode: %d\n",listen(sock,5));

//qui entra in ballo quello temporaneo
while((temp=accept(sock,&addr,NULL))==SOCKET_ERROR );

sock=temp; //passo temp al socket creato inizialmente

if(sock)
MsgProc();

WSACleanup();
}


void MsgProc()
{
char buf[10];
int res=1;
while((res=recv(sock,buf,LBUF,0))!=SOCKET_ERROR)
{
if(res==0||res==WSAECONNRESET||res==WSAECONNABORTE D)
{
printf("Client terminated connection\n");
break;
}

_flushall();//probably not needed

printf("Recieved string: %s\n",buf);

send(sock,buf,LBUF,0);
}

closesocket(sock);
}



// CLIENT

#include <stdio.h>
#include <windows.h>
#include <winsock.h>
#include <process.h>

#define PORT 4000
#define LSTRING 10

SOCKET sock=NULL;

SOCKADDR addr;

void MsgProc();

void main()
{
WSADATA dat;
WORD ver=MAKEWORD(2,2);

int res;
SOCKADDR_IN addr_in;
addr_in.sin_family=AF_INET;
addr_in.sin_port=PORT;
addr_in.sin_addr.S_un.S_un_b.s_b1=127;
addr_in.sin_addr.S_un.S_un_b.s_b2=0;
addr_in.sin_addr.S_un.S_un_b.s_b3=0;
addr_in.sin_addr.S_un.S_un_b.s_b4=1;

memcpy(&addr,&addr_in,sizeof(SOCKADDR_IN));


printf("Remember, 0s are good\n");

printf("WSAStartup: %d. Version %d\n",(res=WSAStartup(ver,&dat)),ver);

if(res!=0)
return;

sock=socket(PF_INET,SOCK_STREAM,0);

printf("Connect: %d\n",(res=connect(sock,&addr,sizeof(addr))));

if(sock==NULL||res!=0)
return;

MsgProc();

WSACleanup();
}


void MsgProc()
{
char str[LSTRING]="";
int res;

while(stricmp(str,"exit")!=0){
printf("String to send: ");
gets(str);

send(sock,str,LSTRING,0);

for(int i=0;(res=recv(sock,str,LSTRING,0))==SOCKET_ERROR&& i<50;i++)
Sleep(100);

if(res==0||res==WSAECONNRESET||res==WSAECONNABORTE D)
{
printf("Server terminated connection\n");
break;
}


}

closesocket(sock);

}


questi il server ed il Client, questi funzionano