codice:
#include <vcl.h>
#include <stdio.h>
#include <iostream.h>
#include <winsock.h>
#include <string.h>
#include <mem.h>
#pragma hdrstop
//Variabili globali no buone
char buff[256];
AnsiString buffbuff;
int val=0;
#pragma argsused
int main(int argc, char* argv[])
{
SOCKET clientsocket;
SOCKADDR_IN addr;
hostent * hostentrata;
char messaggio[80];
short port;
WORD wVersionRequested = MAKEWORD(2,2);
WSADATA wsaData;
int nLen=sizeof(SOCKADDR);
int ricv;
if (WSAStartup(wVersionRequested, &wsaData)!= NO_ERROR)
{
cout << "Errore di Inizializzazione" << endl;
goto fine;
}
port = 25;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("83.224.64.25");
addr.sin_port = htons(port);
clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //Non controlli il valore di uscita
if (connect(clientsocket, (LPSOCKADDR)&addr, sizeof(addr)) < 0)
{
printf("Errore nella connessione con il Server\nPremi invio per uscire.");
goto fine;
}
//Usare una variabile globale per i controlli è male, può portare a situazioni amibigue e comportamenti imprevisti.
dinuov:
if (val==1)
{
goto salto;
}
//Non controlli il valore di uscita di ricv
risult:
memset(buff,0,sizeof(buff));
ricv=recvfrom(clientsocket,buff,sizeof(buff),0,(LPSOCKADDR)&addr, &nLen);
printf("%s\n",buff);
cout << "\t";
//Prendi 256 caratteri in input, quando messaggio ne contiene 80 ! Buffer Overflow, no buono.
salto:
cin.get(messaggio, 256, '\n');
//Puoi usare cin.sync()
while (cin.get() != '\n');
//Non puoi utilizzare direttamente messaggio ?
strcpy(buff,messaggio);
strcat(buff, "\n");
sendto(clientsocket,buff,strlen(buff),0,(LPSOCKADDR)&addr, nLen);
//Buffer Overflow !!!!
strcpy(buff,messaggio);
buffbuff=(char*)buff;
if (buffbuff=="Data"||buffbuff=="data")
{
//Esiste il !=
if (!val==1)
{
val=1;
goto risult;
}
}
if (buffbuff==".")
{
val=0;
}
goto dinuov;
fine:
closesocket(clientsocket);
WSACleanup();
getchar();
//Manca il return 0
}