Visualizzazione dei risultati da 1 a 2 su 2

Discussione: [C] NamedPipes

  1. #1

    [C] NamedPipes

    Salve a todos.Supponiamo di avere due applicazioni,una che fa da client e una da server in una comunicazione interprocesso mediante NamedPipes.Supponiamo che il nome della pipe sia "\\\\.\\pipe\\mypipe" per tutte le istanze sia dei client che dei server.Nelle mie intenzioni il server deve gestire le richieste di più clients e per far questo crea più thread ognuno dei quali riceve un proprio handle alla pipe (creato grazie a CreateNamedPipe con PIPE_UNLIMITED_INSTANCES come numero massimo di istanze).
    Se avvio un solo server e molti client nessun problema,il server è in grado di ricevere i dati da tutti i client,se però contemporaneamente avvio un'altro server,questo non è recettivo,cioè i dati inviati dai client vengono ricevuti solo dal primo server e da lui no,mentre io vorrei che i dati inviati da qualiasi client arrivassero a tutti i server attualmente attivi,non solo ad uno.Un pò di codice così si capisce meglio:

    server:
    codice:
    main()
    {
    	DWORD dwThreadID;
    	BOOL bConnected;
    	HANDLE hPipe,hThread;
    	while(1)
    	{
    		hPipe = CreateNamedPipe
    (PIPENAME,PIPE_ACCESS_INBOUND,
    PIPE_TYPE_BYTE | 
    PIPE_WAIT,PIPE_UNLIMITED_INSTANCES,
    0, 0, PIPETIMEOUT, NULL);
    		if(hPipe == INVALID_HANDLE_VALUE)
    			return -1;
    		bConnected = ConnectNamedPipe(hPipe, NULL) ? TRUE
    			: (GetLastError() == ERROR_PIPE_CONNECTED);
    		if(bConnected)
    		{
    			hThread = CreateThread(NULL,0,ListenerProc,hPipe,0,&dwThreadID);
    			if(!hThread)
    				return -1;
    			else
    				CloseHandle(hThread);
    		}
    		else
    			CloseHandle(hPipe);
    	}
    	return 1;
    }
    DWORD WINAPI ListenerProc(LPVOID hPipe)
    {
    	DWORD dwBytesRead = 0;
    	char buff[512];
    	HANDLE hThisPipe = (HANDLE)hPipe;
    	
    	while (ReadFile(hThisPipe, buff, 512, &dwBytesRead, NULL))
    	{
    		buff[dwBytesRead] = 0;
    		//processa i dati letti
    		//.......
    	}
    	FlushFileBuffers(hThisPipe); 
    	DisconnectNamedPipe(hThisPipe); 
    	CloseHandle(hThisPipe); 
    	return 1;
    }
    (Ogni client ha un solo handle alla pipe)
    client:
    codice:
    BOOL Connect()
    {
    	m_hPipe = CreateFile(PIPENAME, GENERIC_WRITE , 0, NULL,
    				OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 
    						NULL);
    	if(m_hPipe != INVALID_HANDLE_VALUE)
    		return TRUE;
    
    	return FALSE;
    }
    BOOL SendData(LPCSTR szData)
    {
    	//.......
    	DWORD dwBytesWritten;
    	if(WriteFile(m_hPipe, szData, (DWORD)strlen(szData), 
    				 &dwBytesWritten, NULL) != FALSE &&
    				 dwBytesWritten == (DWORD)strlen(szData))
    		return TRUE;
    	CloseHandle(m_hPipe);
    	//.............
    	return FALSE;
    }
    Nel server quando avvio due istanze del server CreateNamedPipe ritorna lo stesso
    valore numerico di hPipe per entrambe però solo la prima istanza salta la
    successiva ConnectNamedPipe(hPipe, NULL) quando arriva una connessione da un client
    ,l'altra si blocca li (e credo sia perchè l'handle è lo stesso ed è già impegnato)
    ma allora perchè GetLastError() non mi da nessun errore.
    Insomma voglio ottenere o di poter inviare da un client a tutti i server attivi oppure
    di avvisare l'utente che non è possibile aprire due server con la stessa pipe,cosa che non
    riesco a fare.

    Il tutto sotto windows (xp)
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  2. #2
    Ho risolto il problema con una createfile prima della createnamedpipe:


    codice:
    hPipe = CreateFile(PIPENAME, GENERIC_WRITE , 0, NULL,
    						 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 
    						 NULL);
    		if(hPipe == INVALID_HANDLE_VALUE)
    			hPipe = CreateNamedPipe(PIPENAME,PIPE_ACCESS_INBOUND,
    										PIPE_TYPE_BYTE | PIPE_WAIT,
    										PIPE_UNLIMITED_INSTANCES, 
    										0, 0, PIPETIMEOUT, NULL);
    		else
    		{
    			CloseHandle(hPipe);
    			return -1;
    		}
    		if(hPipe == INVALID_HANDLE_VALUE)
    			return -1;
    Ora però ho un'altro problema,con ExitCodeThread,vedete la discussione apposita che ho aperto.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

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 © 2024 vBulletin Solutions, Inc. All rights reserved.