|
/*
Simple Chat Server With Multithreading Function
Author: Dir31 rbt-4 crew and HIC
*/
#include <conio.h>
#include<iostream>
#include <stdio.h>
#include <windows.h>
#include <process.h>
#include <winsock.h>
using namespace std;
#define KEY_ESC 0x1b
#define ENTER 0x0d
/* Variabili Globali */
int err; //
bool IsClosed= false; //
SOCKET temp,asock= 0; //
/*--------------------*/
/*Funzione che Chiuderà Le Connessioni*/
void CloseIt ();
/*Thread Che Prende Un Carattere E Lo Inerisce In Un Buffer, Finchè Non Sarà
Premuto Invio. Se Viene Premuto "Esc" Richiamerà La Funzione CloseIt() */
void _cdecl Receive_Thread (void *NULL_var ){
int cont;
char MexToReceive [200],mexin= ' ';
for(;; ){
for(int i= 0; i<=cont;i++ )
MexToReceive [i ]= '\0';
cont= 0;
do{
mexin= '\0';
err=recv (asock, &mexin, 1, 0);
MexToReceive [cont ]=mexin;
cont++;
if(mexin==KEY_ESC ){
cout<< "The Client Has Been Closed The Connection\n";
_sleep (1500);
CloseIt ();
return;
}
}while(mexin!=ENTER );
cout<<MexToReceive<<endl;
}
return;
}/* _endthread() */
int main (){
/*Variabili Locali Del Main*/
SOCKADDR_IN addr_in, asock_in;
SOCKADDR addr;
char mex []= "CHAT SERVER BY DIR_31\n\rPress The \"Esc\" Key To Close The Client Connection\n\n\r";
char MexToSend [200];
WSADATA dat;
WORD ver=MAKEWORD (1, 1);
int res,nihl,addrlen;
/*---------------------------*/
printf("WSAStartup: %d Version %d\n", (res=WSAStartup (ver,&dat )),ver );
if(res!= 0)
return 0;
temp = socket (PF_INET, SOCK_STREAM, 0);
if(temp==INVALID_SOCKET ){
printf("Socket() Error, Return (%d)\n",
WSAGetLastError ());
system ("pause");
return(1);
}
else printf("socket()... OK!\n");
/*Configuro La Sockaddr*/
addr_in. sin_family = PF_INET;
addr_in. sin_port = htons (IPPORT_TELNET );
addr_in. sin_addr. s_addr = INADDR_ANY;
/*----------------------*/
err = bind (temp, (struct sockaddr* )&addr_in, sizeof(struct sockaddr_in ));
if(err==SOCKET_ERROR ){
printf("Bind() Error, Return (%d)\n",
WSAGetLastError ());
system ("pause");
return(1);
}
else printf("bind()... OK!\n");
err=listen (temp, 5);
if(err==SOCKET_ERROR ){
printf("Listen() Error, Return (%d)\n",
WSAGetLastError ());
system ("pause");
return(1);
}
else
printf("listen()... OK!\nWaiting For External Connection...\n");
addrlen= sizeof(struct sockaddr );
asock=accept (temp, (struct sockaddr* )&asock_in, (LPINT )&addrlen );
if(asock==INVALID_SOCKET ){
printf("Accept() Error, Return (%d)\n",
WSAGetLastError ());
system ("pause");
return(1);
}
err=send (asock, &mex [0], strlen (mex ), 0);
if(err==SOCKET_ERROR ){
printf("Send() Error, Return (%d)\n",
WSAGetLastError ());
system ("pause");
return(1);
}
else printf("send() OK\n\n");
/*Lancio Il Thread*/
_beginthread (Receive_Thread, 0,static_cast<void *> (&nihl ));
/*Finchè Non Sarà Inviata La Parola Exit Il Ciclo Non Finirà, A Meno Che La Variabile
IsClosed Non E' Impostata A True, Ovvero Non E' Stata Chiamata Precedentemente la
Funzione CloseIt()*/
while(strcmp (MexToSend, "exit")){
if(IsClosed )
break;
else{
cin>>MexToSend;
send (asock, "\n\r", 2, 0);
send (asock,&MexToSend [0],strlen (MexToSend ), 0);
send (asock, "\n\r", 2, 0);
}
}
/*Se Le Connessioni Non Sono Ancora State Terminate, Le Chiudiamo*/
if(IsClosed== false)
CloseIt ();
WSACleanup ();
system ("pause");
return(0);
} /*End*/
/*Funzione Che Chiuderà Le Connessioni*/
void CloseIt (){
shutdown (temp, 2);
err=closesocket (temp );
if(err==SOCKET_ERROR ){
printf("Closesocket(sock21) Error, Return (%d)\n",
WSAGetLastError ());
system ("pause");
return;
}
else printf("closesocket(Server)... OK\n");
err=closesocket (asock );
if(err==SOCKET_ERROR ){
printf("Closesocket(sock21) Error, Return (%d)\n",
WSAGetLastError ());
system ("pause");
return;
}
else printf("closesocket(Client)... OK\n");
cout<< "Send A Casual Key To Close\n";
IsClosed= true;
}
|
|
|
| |
|
|