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