Tra i vecchi progetti miei.
Inizia a studiare

codice:
//Loffing

#include <iostream>
#include <WinSock2.h>

#pragma comment(lib,"Ws2_32.lib")


using namespace std;

short mode;

//Prototipi semigay
DWORD __stdcall StartServer(void *p);
DWORD __stdcall StartClient(void *p);

DWORD __stdcall ReceiveThread(void *p);
DWORD __stdcall SendThread(void *p);

int main()
{

tryagain:
	system("CLS");
	cout <<"SimpleChat by Vinz\n";	
	cout <<"Inserire 1 per modalita' Server, 0 per modalita' Client\n";
	cin >> mode;

	WSADATA data;

	WSAStartup(MAKEWORD(2,2),&data);

	switch (mode)
		{
			case 0:	
				StartClient(NULL);
				WSACleanup();
				break;
			case 1:
				StartServer(NULL);
				WSACleanup();
				break;
			case 3:
				{
					HANDLE h = CreateThread(NULL,NULL,StartServer,0,0,0);
					StartClient(NULL);
					WaitForSingleObject(h,INFINITE);
					CloseHandle(h);
					WSACleanup();
				}
				break;
			default:
				cout <<"Scelta non valida.";
				cout.flush();
				goto tryagain;
				break;
		}

	return 0;
}

DWORD  __stdcall StartServer(void *p)
{
	/*
	cout <<"Inserire porta su cui ascoltare \n";
	cin >> porta;
*/

	const char *nickname = "SERVER";
	sockaddr_in data;
	data.sin_port = htons(1234);
	data.sin_family = AF_INET;
	data.sin_addr.S_un.S_addr = inet_addr("192.168.1.68");

	SOCKET sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
		

	bind(sock,(const sockaddr*)&data,sizeof(data));
	listen(sock,SOMAXCONN);

	SOCKET ClientSocket = accept(sock,NULL,NULL);
	
	
	char buffer[100];
	int bytes = recv(ClientSocket,buffer,100,0);
	buffer[bytes] = 0;
	
	char *tmp = strtok(buffer,"|");
	tmp = strtok(NULL,"|");
	if ((*tmp) != 'N')
	{	
		cout <<"Il client non ha mandato la richiesta adeguata \n";
		
			closesocket(ClientSocket);
			WSACleanup();
		
		return 1;
	}
		cout <<"Connessione stabilita con " << buffer <<endl;

	send(ClientSocket,nickname,strlen(nickname),0);

	HANDLE h = CreateThread(NULL,0,SendThread,&ClientSocket,0,0);

	do 
	{
		memset(buffer,0,100);
		bytes = recv(ClientSocket,buffer,100,0);
		cout << nickname <<":" << buffer <<endl;
		if (strcmp(buffer,"EXIT") == 0 )
			break;

	} while (bytes > 0);

	shutdown(ClientSocket,SD_SEND);
	WaitForSingleObject(h,INFINITE);
	CloseHandle(h);
	closesocket(ClientSocket);
	closesocket(sock);
	return 0;
}

DWORD  __stdcall StartClient(void *p)
{
	char ip[13];
	char NickName[10];
	char buf[100];
	unsigned short porta;

	cout <<"Inserire IP a cui connettersi \n";
		cin >> ip;
	cout <<"Inserire porta a cui connettersi \n";
		cin >> porta;
	cout <<"Inserire nickname per la chat \n";
		cin >> NickName;

	strcat(NickName,"|N");

	sockaddr_in data;
	data.sin_port = htons(porta);
	data.sin_family = AF_INET;
	data.sin_addr.S_un.S_addr = inet_addr(ip);
	

	SOCKET sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	connect(sock,(const sockaddr*)&data,sizeof(data));
	send(sock,NickName,strlen(NickName),0);

	
	int bytes = 0;

		bytes = recv(sock,buf,100,0);
		buf[bytes] = 0;
	
	cout <<"Connessione stabilita con " << buf <<endl;

	//Si sono sincronizzati i pc. Iniziare loop.

	HANDLE th = CreateThread(NULL,0,ReceiveThread,(LPVOID)&sock,0,NULL);

	do 
	{
		cin >> buf;
		send(sock,buf,strlen(buf),0);

	} while (strcmp(buf,"EXIT") != 0);

	CloseHandle(th);
	shutdown(sock,SD_SEND);
	WaitForSingleObject(th,INFINITE);
	closesocket(sock);

	return 0;
}

DWORD __stdcall ReceiveThread(void *p)
{
	char buf[100];
	SOCKET *sock = (SOCKET*)p;
	int bytes = 0;

	do 
	{
		memset(buf,0,100);
		bytes = recv(*sock,buf,100,0);
		buf[bytes] = 0;
		cout << buf <<endl;

	} while (bytes > 0);

	return 0;
}
DWORD __stdcall SendThread(void *p)
{
	char buf[100];
	SOCKET *sock = (SOCKET*)p;
	int bytes = 0;

	do 
	{
		memset(buf,0,100);
		cin >> buf;
		send(*sock,buf,strlen(buf),0);

	} while (strcmp(buf,"EXIT") != 0);

	return 0;
}