Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19

Discussione: [C] Piccola chat

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    174

    [C] Piccola chat

    Ciao ragazzi, vorei sviluppare un chat in c, anche rudimentale.. Solo che non so bene da dove iniziare, non é che conoscete un qualche sito che spiega i passi principali su come farla?? Grazie mille

    ciaooo

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Conosci le basi della programmazione di rete (socket ... ecc ...) ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    174
    Si un po. Con i socket sono riuscito a far scambiare un messaggio tra un client e un server, ma dopo il server esce e per ricevere un nuovo messaggio deve far si che si connetta un nuovo client....

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    E' un po' pochino ... ci vorrebbe anche esperienza con il multithreading ... comunque, dai un'occhiata a questo articolo

    http://www.codeproject.com/KB/cpp/ch...nt_server.aspx
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Tra i vecchi progetti miei.
    Inizia a studiare

    codice:
    //Loffing
    
    #include <iostream>
    #include <WinSock2.h>
    
    #pragma comment(lib,"Ws2_32.lib")
    
    
    using namespace std;
    
    short mode;
    
    //Prototipi semigay
    DWORD __stdcall StartServer(void *p);
    DWORD __stdcall StartClient(void *p);
    
    DWORD __stdcall ReceiveThread(void *p);
    DWORD __stdcall SendThread(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);
    				WSACleanup();
    				break;
    			case 1:
    				StartServer(NULL);
    				WSACleanup();
    				break;
    			case 3:
    				{
    					HANDLE h = CreateThread(NULL,NULL,StartServer,0,0,0);
    					StartClient(NULL);
    					WaitForSingleObject(h,INFINITE);
    					CloseHandle(h);
    					WSACleanup();
    				}
    				break;
    			default:
    				cout <<"Scelta non valida.";
    				cout.flush();
    				goto tryagain;
    				break;
    		}
    
    	return 0;
    }
    
    DWORD  __stdcall StartServer(void *p)
    {
    	/*
    	cout <<"Inserire porta su cui ascoltare \n";
    	cin >> porta;
    */
    
    	const char *nickname = "SERVER";
    	sockaddr_in data;
    	data.sin_port = htons(1234);
    	data.sin_family = AF_INET;
    	data.sin_addr.S_un.S_addr = inet_addr("192.168.1.68");
    
    	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);
    	
    	
    	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(ClientSocket,nickname,strlen(nickname),0);
    
    	HANDLE h = CreateThread(NULL,0,SendThread,&ClientSocket,0,0);
    
    	do 
    	{
    		memset(buffer,0,100);
    		bytes = recv(ClientSocket,buffer,100,0);
    		cout << nickname <<":" << buffer <<endl;
    		if (strcmp(buffer,"EXIT") == 0 )
    			break;
    
    	} while (bytes > 0);
    
    	shutdown(ClientSocket,SD_SEND);
    	WaitForSingleObject(h,INFINITE);
    	CloseHandle(h);
    	closesocket(ClientSocket);
    	closesocket(sock);
    	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);
    
    	
    	int bytes = 0;
    
    		bytes = recv(sock,buf,100,0);
    		buf[bytes] = 0;
    	
    	cout <<"Connessione stabilita con " << buf <<endl;
    
    	//Si sono sincronizzati i pc. Iniziare loop.
    
    	HANDLE th = CreateThread(NULL,0,ReceiveThread,(LPVOID)&sock,0,NULL);
    
    	do 
    	{
    		cin >> buf;
    		send(sock,buf,strlen(buf),0);
    
    	} while (strcmp(buf,"EXIT") != 0);
    
    	CloseHandle(th);
    	shutdown(sock,SD_SEND);
    	WaitForSingleObject(th,INFINITE);
    	closesocket(sock);
    
    	return 0;
    }
    
    DWORD __stdcall ReceiveThread(void *p)
    {
    	char buf[100];
    	SOCKET *sock = (SOCKET*)p;
    	int bytes = 0;
    
    	do 
    	{
    		memset(buf,0,100);
    		bytes = recv(*sock,buf,100,0);
    		buf[bytes] = 0;
    		cout << buf <<endl;
    
    	} while (bytes > 0);
    
    	return 0;
    }
    DWORD __stdcall SendThread(void *p)
    {
    	char buf[100];
    	SOCKET *sock = (SOCKET*)p;
    	int bytes = 0;
    
    	do 
    	{
    		memset(buf,0,100);
    		cin >> buf;
    		send(*sock,buf,strlen(buf),0);
    
    	} while (strcmp(buf,"EXIT") != 0);
    
    	return 0;
    }
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  6. #6
    10 frustate per la system, 50 per il goto, 100 per il potenziale buffer overflow all'inizio di StartClient, 150 perché non controlli mai il valore restituito dalla recv, che può essere SOCKET_ERROR, definito di solito come -1, per cui nella linea buffer[bytes]=0 andresti a scrivere su memoria che non c'entra niente.
    (Sui prototipi sorvoliamo... )
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    13
    Praticamente ti ha detto grazie.
    GameOperator: KingsAge.it

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da devel
    Praticamente ti ha detto grazie.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Originariamente inviato da MItaly
    10 frustate per la system, 50 per il goto, 100 per il potenziale buffer overflow all'inizio di StartClient, 150 perché non controlli mai il valore restituito dalla recv, che può essere SOCKET_ERROR, definito di solito come -1, per cui nella linea buffer[bytes]=0 andresti a scrivere su memoria che non c'entra niente.
    (Sui prototipi sorvoliamo... )
    Penso che l'aggettivo VECCHIO dovrebbe giustificare buona parte di tali errori.
    1 frustata perchè non l'ho corretto nel tempo.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    E per fortuna non si è accorto della CreateThread che genera memory leaks in C/C++ se la CRT è SingleThreaded.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.