Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [c++] Socket e Multithreading

    (1/2)

    Sto iniziando a giocherellare con il multitheading e con i socket, e data la mia scarsissima esperienza in programmazione con il c++ (tre mesi appena) credo di stare a creare un pò di casino....

    ho scribacchiato una specie di server che riesce a prendere più connessioni contemporanee... solo che non riesce a gestirle insieme! In particolare il problema sorge quando apro una seconda connessione, il thread che gestisce la prima connessione non va più avanti (o almeno a me così sembra...)

    Ecco il codice

    codice:
    // File multithreading.cpp
    
    #include <iostream>
    #include <winsock2.h>
    #include <winbase.h>
    #include <queue>
    
    using namespace std;
    
    
    void main()
    {
    	SOCKET s,ss;
    	DWORD ThreadId;
    	WORD wVersionRequested;
    	WSADATA wsaData;
    	sockaddr_in any_addr, remote_addr;
    	int addrlen;
    
    
    	wVersionRequested = MAKEWORD(2,0);
    	WSAStartup( wVersionRequested, &wsaData) ;
    
    	any_addr.sin_family=AF_INET;
    	any_addr.sin_port=htons( IPPORT_TELNET );
    	any_addr.sin_addr.s_addr=htonl ( INADDR_ANY );
    
    
    	s = socket(AF_INET,SOCK_STREAM,0);
    	if(s==INVALID_SOCKET) {exit(2);}
    
    	if(bind(s,(struct sockaddr *) &any_addr, sizeof(struct sockaddr_in)))
    	{
    		WSACleanup();
    		exit(0);
    	}
    	listen(s,10);
    
    	addrlen=sizeof(struct sockaddr);
    
    
    	while(true)
    	{
    		ss=accept(s,(struct sockaddr *) &remote_addr,(LPINT)&addrlen);
    
    		CreateThread(NULL,0,controlla, &ss, 0, &ThreadId);
    		
    		
    	}
    }
    Se Pacman avesse influenzato la nostra generazione, staremmo tutti saltando in sale scure, masticando pillole magiche e ascoltando musica elettronica ripetitiva
    Pochi anni dopo nacquero le feste rave, la musica techno e l'ecstasy

  2. #2
    (2/2)

    Chiedo venia per il disordine immane del codice....
    Purtroppo oggi non funzia neppure la ricerca

    Se potete indicarmi anche link di rifrimento vi sarei grato...

    codice:
    // File ControlThread.cpp
    
    #include <iostream> 
    #include <winsock2.h>
    #define KEY_ESC      0x1b
    
    using namespace std;
    
    
    const char strLogin[]="Mio server di prova\nPremi ESC per disconnetterti\n\r";
    const char strCommandReply[]=": Comando non ancora implementato\n\r";
    
    
    
    
    void sSay(LPVOID sock, const char * string)
    {
    	send(*(SOCKET *)sock, &string[0], strlen(string), 0);
    }
    
    
    
    void ExecCommand(const int pid, char * command, LPVOID sock, int &index)
    {
    		cout << pid << ": manda il comando '" << command << "'" << endl;
    		sSay(sock, strcat(command,strCommandReply));
    		index=0;	
    }
    
    
    DWORD WINAPI controlla(LPVOID sock)
    {
    	int pid, err, CommandIndex = 0;
    	char rec, strCommand[100];
    	strCommand[1] = '\0';
    
    	pid=GetCurrentThreadId();
    	cout << "Nuova connessione aperta: " << pid << endl;
    	cout << pid << ": Invio i dati al client..." << endl;
    
    	sSay(sock, &strLogin[0]);
    	
    	while(rec != KEY_ESC)
    	{
    		err = recv(*(SOCKET *)sock, &rec ,1,0);
    		if (err == SOCKET_ERROR)
    		{
    			cerr << pid << ": Errore Socket: " << WSAGetLastError() << endl;
    			return 1;
    		}
    
    		//	copia nella strCommand
    		if (rec != 13)
    		{
    			if (rec != 10)
    			{
    				strCommand[CommandIndex++] = rec;
    				strCommand[CommandIndex+1] = '\0';
    			}
    		}
    		else
    		{
    			rec = ' ';
    			ExecCommand(pid, strCommand,sock,CommandIndex);
    		}
    
    	}
    	cout << pid << ": Utente Disconnesso" << endl;
    	shutdown(*(SOCKET *)sock, 2);
    
    	return 0;
    	
    }
    Se Pacman avesse influenzato la nostra generazione, staremmo tutti saltando in sale scure, masticando pillole magiche e ascoltando musica elettronica ripetitiva
    Pochi anni dopo nacquero le feste rave, la musica techno e l'ecstasy

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.