codice:
	#include <iostream>
#include <WinSock2.h>
#pragma comment(lib,"Ws2_32.lib")
using namespace std;
int mode;
DWORD __stdcall StartServer(void *p);
DWORD __stdcall StartClient(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);
				break;
			case 1:
				StartServer(NULL);
				break;
			case 3:
				{
					HANDLE h = CreateThread(NULL,NULL,StartServer,0,0,0);
					StartClient(NULL);
					WaitForSingleObject(h,INFINITE);
					CloseHandle(h);
				}
				break;
			default:
				cout <<"Scelta non valida.";
				cout.flush();
				goto tryagain;
				break;
		}
	return 0;
}
DWORD  __stdcall StartServer(void *p)
{
	/*
	char ip[13];
	unsigned short porta;
	cout <<"Inserire IP pubblico su cui ascoltare.  \n";
	cin >> ip;
	cout <<"Inserire porta su cui ascoltare \n";
	cin >> porta;
*/
	char *nickname = "SERVERNICK";
	sockaddr_in data;
	data.sin_port = htons(1234);
	data.sin_family = AF_INET;
	data.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	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);
	
	closesocket(sock);
	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(sock,nickname,strlen(nickname),0);
	bytes = recv(sock,buffer,100,0);
	while (bytes != 0)
	{
		;
	}
	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);
	listen(sock,SOMAXCONN);
	accept(sock,NULL,NULL);
	int bytes = recv(sock,buf,100,0);
	while (bytes == -1)
		bytes = recv(sock,buf,100,0);
	
	buf[bytes] = 0;
	cout <<"Connessione stabilita con " << buf <<endl;
	return 0;
}
 
Lasciate stare l'orrida progettazione...sono costretto a usare un thread separato per far partire server e client insieme