#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<winsock.h>
#define NUMBER_MAX_CLIENT 1000
#define TIMEOUT 800
#define nick "Server: "
#define INVIO 0x0D
int chiudi=1;
int dclient[NUMBER_MAX_CLIENT];
int Protocol_Gst(char buffer[500],int l_buffrecv,int IDclient);
int SendToOther(char buffer[500],int IDCsend);
int GetText(char *szBuffer, int nMaxLenght);
int Config (int IDconf, char Param[50]);
int SetNick(char Nick[50],int IDclient);
int SendToAll(char buffer[500]);
int Logga(char buffer[500]);
int menu(int IDmenu);
SOCKET miosock,acceptsock,pieno,client[NUMBER_MAX_CLIENT];
struct sockaddr_in miosock_addr,client_addr;
WSADATA data;
WORD p;
int len(char *);
int lun, err=0;
int n;
int i;
int gt;
int Log;
int Rmenu;
int ChatMode;
int ServerON=1;
int MAX_CLIENT;
int timeout[NUMBER_MAX_CLIENT];
int ClientLogged[NUMBER_MAX_CLIENT];
int passparam;
int ClientConn=0;
char nickclient[NUMBER_MAX_CLIENT][50];
char buffersend[500];
char Clear_line[500];
char logfile[1000];
SYSTEMTIME LocalTime;
DWORD dwThreadClientId[NUMBER_MAX_CLIENT],dwThreadInvioId,dwThreadAcceptClientId, dwThrdParam = 1;
HANDLE ThClient[NUMBER_MAX_CLIENT];
HANDLE ThInvio;
HANDLE AcceptConn;
DWORD ricezione (LPDWORD lpdwParam)
{
int IDclient = passparam;
ClientConn++;
timeout[IDclient] = clock() + TIMEOUT;
int r;
int count = 0;
char bufferrecv[503];
char NickBuf[53];
char temp[100];
strcpy(nickclient[IDclient], "NULL");
while ((strcmp(nickclient[IDclient], "NULL" )) == 0)
{
if (count >= 5)
{
send(client[IDclient], "105 Numero di tentativi massimi raggiunto\n", 41, 0);
send(client[IDclient], "192 Disconnect", 14, 0);
sleep(10);
dclient[IDclient] = 0;
break;
}
else
{
send(client[IDclient],"105 \nInserisci un nick(max 50 car.): ", 37, 0);
n = 0;
NickBuf[0] = 0;
n = recv(client[IDclient], NickBuf, 53, 0);
NickBuf[n] = 0;
r = SetNick(NickBuf, IDclient);
if (r == 0)
{
ClientLogged[IDclient] = 0;
send(client[IDclient], "110 NICK OK\r", 12, 0);
/*sprintf(temp, "140 %i", IDclient);
int c = strlen(temp);
send(client[IDclient], temp, c, 0);*/
sprintf(temp, "105 \n%s CONNESSO\n\n", NickBuf);
SendToOther(temp, IDclient);
if (Log == 0){
sprintf(temp, "%s CONNESSO\n\n", NickBuf);
Logga(temp);
}
if (ChatMode == 0)
printf("\n%s CONNESSO\n\n", NickBuf
);
}
if (r != 0)
send(client[IDclient], "105 Nick gia' in uso\n", 22, 0);
}
count++;
sleep(1);
}
while (dclient[IDclient] != 0)
{
n = 0;
bufferrecv[0] = 0;
n = recv(client[IDclient], bufferrecv, 500, 0);
bufferrecv[n] = 0;
if (gt > 0)
{
int b = gt;
Clear_line[b] = 0;
for(b = gt; b >= 0; b--)
{
Clear_line[b] = ' ';
}
Protocol_Gst(bufferrecv, n, IDclient);
char buffer[500];
int c = gt;
strcpy(buffer, buffersend);
buffer[c] = 0;
}
else
Protocol_Gst(bufferrecv, n, IDclient);
sleep(1);
}
if (ClientLogged[IDclient] == 0)
{
sprintf(temp, "105 \n%s SCONNESSO\n\n", NickBuf);
SendToOther(temp, IDclient);
if (Log == 0){
sprintf(temp, "%s SCONNESSO\n\n", NickBuf);
Logga(temp);
}
if (ChatMode == 0)
printf("\n%s SCONNESSO\n\n", NickBuf
);
}
send(client[IDclient], "192 Disconnect", 14, 0);
ClientLogged[IDclient] = 1;
ClientConn--;
strcpy(nickclient[IDclient], "NULL");
closesocket(client[IDclient]);
client[IDclient] = SOCKET_ERROR;
return 0;
}
DWORD invio (LPDWORD lpdwParam)
{
int z;
char temp[500];
while (chiudi != 0)
{
buffersend[0] = 0;
z = GetText(buffersend, 500);
if (z == 2)
break;
z = strlen(buffersend);
sprintf(temp, "105 %s: %s", nick, buffersend);
z = strlen(temp);
SendToAll(temp);
sleep(3);
}
return 0;
}
DWORD AcceptClient (LPDWORD lpdwParam)
{
while (ServerON == 0)
{
acceptsock = SOCKET_ERROR;
acceptsock = accept(miosock, 0, 0);
if (ClientConn >= MAX_CLIENT)
{
pieno = acceptsock;
send(pieno, "105 \nServer pieno", 17, 0);
sleep(3);
closesocket(pieno);
}
else
{
for (i = 1; i <= MAX_CLIENT; i++)
{
if (client[i] == SOCKET_ERROR)
{
client[i] = acceptsock;
if (client[i] != SOCKET_ERROR)
{
passparam = i;
dclient[i] = 1;
ThClient[i] = CreateThread(NULL,
0, (LPTHREAD_START_ROUTINE) ricezione,
&dwThrdParam, 0,
&dwThreadClientId[i]);
}
break;
closesocket(acceptsock);
}
sleep(1);
}
}
sleep(1);
}
return 0;
}
int main (int argn, char **argv)
{
Title();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
printf("\nCaricamento in corso...");
for (i = 0; i <= NUMBER_MAX_CLIENT; i++)
{
client[i] = SOCKET_ERROR;
}
for (i = 0; i <= NUMBER_MAX_CLIENT; i++)
{
ClientLogged[i] = 1;
}
chiudi = 1;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10);
Config(0, 0);
while (chiudi != 0)
{
Rmenu = menu(0);
if (Rmenu == 1)
{
for (i = 0; i <= MAX_CLIENT; i++)
{
closesocket(client[i]);
}
closesocket(miosock);
WSACleanup();
break;
}
}
return 0;
}
int Protocol_Gst (char buffer[500], int l_buffrecv, int IDclient)
{
char Com_Mess[3] = "000";
Com_Mess[0] = buffer[0];
Com_Mess[1] = buffer[1];
Com_Mess[2] = buffer[2];
Com_Mess[3] = 0;
if ((strcmp(Com_Mess, "105")) == 0)
{
char temp[500];
int i = 0;
int c;
for(c = 4; c <= l_buffrecv; c++)
{
temp[i] = buffer[c];
i++;
}
temp[i] = 0;
sprintf(buffer, "105 %s : %s", nickclient[IDclient], temp);
SendToOther(buffer, IDclient);
sprintf(buffer, "%s : %s", nickclient[IDclient], temp);
if (Log == 0)
Logga(buffer);
if (ChatMode == 0)
timeout[IDclient]=clock()+TIMEOUT;
}
else if ((strcmp(Com_Mess, "165")) == 0)
{
int error = 1;
char temp[500];
int b = l_buffrecv - 4;
char buf[b];
int c = 0;
for (b = 5; b <= l_buffrecv; b++)
{
buf[c] = buffer[b];
c++;
}
c = c - 2;
buf[c] = 0;
/* Commands without parameters */
if ((strcmp(buf, "listclient")) == 0)
{
sprintf(temp, "105 \n\nID Client \t\t Nickname\n\n %i \t\t\t %s\n", IDclient, nickclient[IDclient]);
b = strlen(temp);
temp[b] = 0;
send(client[IDclient], temp, b, 0);
int IDC;
for (IDC = 0; IDC <= MAX_CLIENT; IDC++)
{
if (IDC != IDclient)
{
if (ClientLogged[IDC] != 1)
{
sprintf(temp, "105 %i \t\t\t %s\n", IDC, nickclient[IDC]);
b = strlen(temp);
send(client[IDclient], temp, b, 0);
}
}
sleep(1);
}
send(client[IDclient],"105 \n\n", 6, 0);
error = 0;
}
else if ((strcmp(buf, "help")) == 0)
{
send(client[IDclient], "105 \nElenco Comandi:\n\n", 21, 0);
send(client[IDclient], "105 /help\t-> Mostra l'elenco comandi\n", 45, 0);
send(client[IDclient], "105 /listclient\t-> Mostra la lista dei client conessi con i rispettivi ID\n", 76, 0);
send(client[IDclient], "105 /pm\t-> permette di inviare pm sintassi: \"/pm ID client Messaggio\"\n\n", 81, 0);
error = 0;
}
/* Commands with parameters */
else {
temp[0] = buf[0];
temp[1] = buf[1];
temp[2] = 0;
if ((strcmp(temp, "pm")) == 0)
{
int IdSendPm;
char TextSendPm[500];
c = 0;
for (b = 3; buf[b] != ' '; b++)
{
temp[c] = buf[b];
c++;
if(b>l_buffrecv-4)
{
send(client[IDclient], "105 \nErrore 180\n", 16, 0);
return 1;
}
}
temp[c] = 0;
IdSendPm = atoi(temp);
if(IdSendPm == IDclient)
{
send(client[IDclient], "105 \nImpossibile inviare un pm a se stessi\n", 44, 0);
return 1;
}
c=0;
for (b = b + 1; buf[b]; b++)
{
TextSendPm[c] = buf[b];
c++;
}
TextSendPm[c] = 0;
sprintf(temp, "105 Messaggio Privato da %s(%i): %s\n",
nickclient[IDclient], IDclient, TextSendPm);
c = strlen(temp);
temp[c] = 0;
send(client[IdSendPm], temp, c, 0);
error=0;
}
}
if (error != 0)
send(client[IDclient], "105 Comando Errato\n\n", 20, 0);
timeout[IDclient] = clock() + TIMEOUT;
}
else if ((strcmp(Com_Mess, "180")) == 0)
timeout[IDclient] = clock() + TIMEOUT;
else if ((strcmp(Com_Mess, "192")) == 0)
dclient[IDclient] = 0;
else if (timeout[IDclient] <= clock())
dclient[IDclient] = 0;
return 0;
}
int SetNick (char NickCli[50], int IDclient)
{
int IDC = 0;
int ln = 0;
char Nick[50];
char Buf_Nick[50];
for (ln = 0; NickCli[ln]; ln++)
{
Nick[ln] = tolower(NickCli[ln]);
}
Nick[ln] = 0;
for (IDC = 0; IDC <= MAX_CLIENT; IDC++)
{
for (ln = 0; nickclient[IDC][ln]; ln++)
{
Buf_Nick[ln] = tolower(nickclient[IDC][ln]);
}
Buf_Nick[ln] = 0;
if ((strcmp(Buf_Nick,Nick)) == 0)
{
return 1;
}
sleep(1);
}
strcpy(nickclient[IDclient],NickCli);
return 0;
}
int SendToAll (char buffer[500])
{
int lstring = strlen(buffer);
int IDC;
for (IDC = 1; IDC <= MAX_CLIENT; IDC++)
{
if (ClientLogged[IDC] != 1)
{
send(client[IDC], buffer, lstring, 0);
}
sleep(1);
}
return 0;
}
int SendToOther (char buffer[500], int IDCsend)
{
int lstring = strlen(buffer);
int IDC;
for (IDC = 1; IDC <= MAX_CLIENT; IDC++)
{
if (IDC != IDCsend)
{
if(ClientLogged[IDC] != 1)
{
send(client[IDC], buffer, lstring, 0);
}
sleep(1);
}
}
return 0;
}
int GetText (char *szBuffer, int nMaxLenght)
{
gt = 0;
char ch;
nMaxLenght - 2;
while (ch != INVIO)
{
ch = getch();
if (ChatMode == 0)
{
if (GetAsyncKeyState(27) == -32767)
return 2;
}
if (gt < 0)
gt = 0;
if (gt > (nMaxLenght))
gt = nMaxLenght;
else
{
if (ch == '\b')
{
if (ch != 0 && gt > 0)
putch('\b');
putch(' ');
putch('\b');
gt--;
}
else
{
szBuffer[gt++] = ch;
putch(ch);
}
}
}
if (gt == 0)
{
szBuffer[0] = '\n';
szBuffer[1] = '\0';
}
else
{
gt--;
szBuffer[gt] = '\n';
gt++;
szBuffer[gt] = '\0';
}
gt=0;
return 0;
}
int Logga(char buffer[500]){
GetLocalTime(&LocalTime);
FILE *log;
log=fopen(logfile,"a");
if(log == NULL)
{
printf("\n\nImpossibile Salvare i log");
}
else
{
fprintf(log,"<p><font face=\"Comic Sans MS\" size=\"2\"><%i:%i> %s</font></p>\n",LocalTime.wHour,LocalTime.wMinute,buffer);
fclose(log);
}
return 0;
}
int Config (int IDconf, char Param[50])
{
HKEY chiave;
DWORD KeyExsist;
char path[] = "SOFTWARE\\Scorpion Software\\Scorpion Messenger\\Server";
if (IDconf == 0)
{
DWORD ipsize;
char Logging[1];
char Max_Users[5];
RegCreateKeyEx(HKEY_LOCAL_MACHINE, path, 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
&chiave, &KeyExsist);
if (KeyExsist == REG_CREATED_NEW_KEY)
{
system("cls");
Title();
printf("\n*** Prima Configurazione del Programma ***\n\n");
printf("\nNumero massimo delle connessioni simultanee: ");
GetText(Max_Users, 50);
Max_Users[strlen(Max_Users)-1] = 0;
MAX_CLIENT = atoi(Max_Users);
RegSetValueEx(chiave, "Max Users", 0, REG_SZ, Max_Users, strlen(Max_Users));
printf("\nVuoi abilitare il logging della chat?(S/N): ");
int ci = 0;
while ( ci == 0)
{
char sc;
sc = getch();
if (tolower(sc) == 's')
{
Log = 0;
RegSetValueEx(chiave, "Log", 0, REG_SZ, "0", 1);
ci = 1;
}
else if (tolower(sc) == 'n')
{
Log = 1;
RegSetValueEx(chiave, "Log", 0, REG_SZ, "1", 1);
ci = 1;
}
}
}
else
{
RegQueryValueEx(chiave, "Max Users", NULL, NULL, Max_Users, &ipsize);
RegQueryValueEx(chiave, "Log", NULL, NULL, Logging, &ipsize);
Log = atoi(Logging);
MAX_CLIENT = atoi(Max_Users);
}
RegCloseKey(chiave);
}
else if (IDconf == 1)
{
RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_SET_VALUE, &chiave);
RegSetValueEx(chiave, "Max Users", 0, REG_SZ, Param, strlen(Param));
RegCloseKey(chiave);
}
else if (IDconf == 2)
{
RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_SET_VALUE, &chiave);
RegSetValueEx(chiave, "Log", 0, REG_SZ, Param, strlen(Param));
RegCloseKey(chiave);
}
if (Log == 0)
{
ExpandEnvironmentStrings("%USERPROFILE%\\Documenti\\", logfile, sizeof(logfile));
strcat(logfile, "Scorpion Messenger");
CreateDirectory(logfile, NULL);
strcat(logfile, "Scorpion Messenger\\Server");
CreateDirectory(logfile, NULL);
GetLocalTime(&LocalTime);
char temp[500];
sprintf(temp, "\\Log_%i_%i_%i.htm", LocalTime.wDay, LocalTime.wMonth, LocalTime.wYear);
strcat(logfile, temp);
}
return 0;
}
int menu (int IDmenu)
{
int scelta;
int CicloMenu;
int cm;
ChatMode = 1;
while (1)
{
if (IDmenu == 0)
{
scelta = 0;
char ScelteMenu0[4][30];
if (ServerON == 0)
{
strcpy(ScelteMenu0[0], "Ferma il Server");
}
else
strcpy(ScelteMenu0[0], "Avvia il Server");
strcpy(ScelteMenu0[1], "Entra in chat");
strcpy(ScelteMenu0[2], "Impostazioni");
strcpy(ScelteMenu0[3], "Credits & Info");
strcpy(ScelteMenu0[4], "Esci");
CicloMenu = 0;
while (CicloMenu == 0)
{
if (GetAsyncKeyState(38) == -32767)
{
if (scelta == 0)
scelta = 4;
else
scelta--;
}
else if (GetAsyncKeyState(40) == -32767)
{
if (scelta == 4)
scelta = 0;
else
scelta++;
}
else if (GetAsyncKeyState(13) == -32767)
{
if (scelta == 0)
{
system("cls");
Title();
if (ServerON == 0)
{
ServerON = 1;
strcpy(ScelteMenu0[0], "Avvia il Server");
TerminateThread(AcceptConn,0);
for (i = 0; i <= MAX_CLIENT; i++)
closesocket(client[i]);
closesocket(miosock);
WSACleanup();
}
else
{
ServerON = 0;
strcpy(ScelteMenu0[0], "Ferma il Server");
p = MAKEWORD(2, 0);
err=WSAStartup(p, &data);
miosock=socket(PF_INET, SOCK_STREAM, 0);
miosock_addr.sin_family = PF_INET;
miosock_addr.sin_port = htons(65);
miosock_addr.sin_addr.s_addr = INADDR_ANY;
err = bind(miosock, (struct sockaddr*) &miosock_addr, sizeof(struct sockaddr_in));
err = listen(miosock,1);
lun = sizeof (struct sockaddr);
AcceptConn = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) AcceptClient, &dwThrdParam, 0, &dwThreadAcceptClientId);
}
}
else if (scelta == 1)
{
system("cls");
Title();
if (ServerON == 0)
{
printf("\nPer uscire dalla Modalit%c Chat premete il tasto \"Esc\"\n", -123
);
system("pause");
system("cls");
Title();
ChatMode = 0;
ThInvio = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) invio, &dwThrdParam, 0, &dwThreadInvioId);
WaitForSingleObject(ThInvio, INFINITE);
ChatMode = 1;
}
else
{
printf("\nNon si pu%c entrare in chat se il server non %c attivo\n", -107
, -118
);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
printf("\n\n-> Indietro <-\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10);
while (GetAsyncKeyState(13) != -32767);
}
}
else if (scelta == 2)
{
IDmenu = 1;
break;
}
else if (scelta == 3)
{
system("cls");
Title();
printf("\nScorpion Messenger 1.0");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
printf("\n\n-> Indietro <-\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),10);
while (GetAsyncKeyState(13) != -32767);
}
else if (scelta == 4)
{
system("cls");
Title();
sleep(1000);
chiudi = 0;
return 1;
}
}
system("cls");
Title();
printf("\t*** Main Men%c ***\n\n", -105
);
for (cm = 0; cm <= 4; cm++)
{
if(cm == scelta)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
printf("\t-> %s <-\n", ScelteMenu0
[cm
]);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10);
}
else
printf("\t %s\n",ScelteMenu0
[cm
]);
}
sleep(5);
getch();
}
}
if(IDmenu == 1)
{
scelta = 0;
char ScelteMenu1[3][80];
strcpy(ScelteMenu1[0], "Setta il numero massimo delle connessioni simultanee");
if (Log != 0)
strcpy(ScelteMenu1[1], "Abilita salvataggio log");
else
strcpy(ScelteMenu1[1], "Disabilita salvataggio log");
strcpy(ScelteMenu1[2], "Indietro");
CicloMenu = 0;
while (CicloMenu == 0)
{
if (GetAsyncKeyState(38) == -32767)
{
if (scelta == 0)
scelta = 2;
else
scelta--;
}
else if (GetAsyncKeyState(40) == -32767)
{
if (scelta == 2)
scelta=0;
else
scelta++;
}
else if (GetAsyncKeyState(13) == -32767)
{
if (scelta == 0)
{
fflush(stdin);
system("cls");
Title();
if (ServerON == 0)
{
printf("\nPrima di cambiare il limite delle conessioni massime simultanee devi fermare il server");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
printf("\n\n-> Indietro <-\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10);
while (GetAsyncKeyState(13) != -32767);
}
else
{
printf("\nLimite Corrente: \"%i\"", MAX_CLIENT
);
printf("\nVuoi Cambiare?(S/N): ");
int ci = 0;
while (ci == 0)
{
char sc = getch();
if (tolower(sc) == 's')
{
putch(sc);
char Temp[4];
int temp;
int cl = 0;
while (cl == 0)
{
printf("\n\nInserisci il numero massimo delle connessioni simultanee(max %i): ", NUMBER_MAX_CLIENT
);
GetText(Temp, 4);
Temp[strlen(Temp) - 1] = 0;
temp = atoi(Temp);
if (temp > NUMBER_MAX_CLIENT)
printf("\nErrore, Massimo %i Utenti",NUMBER_MAX_CLIENT
);
else if (temp < 0)
else
{
MAX_CLIENT = temp;
Config(1, Temp);
cl = 1;
}
}
ci = 1;
}
else if (tolower(sc) == 'n')
{
putch(sc);
ci = 1;
}
}
}
}
else if (scelta == 1)
{
if (Log == 0)
{
Log = 1;
Config(2, "1");
strcpy(ScelteMenu1[1], "Abilita salvataggio log");
}
else
{
Log = 0;
Config(2, "0");
strcpy(ScelteMenu1[1], "Disabilita salvataggio log");
}
}
else if (scelta == 2)
{
IDmenu=0;
break;
}
}
system("cls");
Title();
printf("\t*** Impostazioni ***\n\n");
for (cm = 0; cm <= 2; cm++)
{
if (cm == scelta)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
printf("\t-> %s <-\n",ScelteMenu1
[cm
]);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10);
}
else
printf("\t %s\n", ScelteMenu1
[cm
]);
}
sleep(5);
getch();
}
}
}
return 0;
}
int Title()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
printf("\n*** Scorpion Messenger Ver. 1.0 Server ***\n\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10);
}