Mit WaitForMultipleObjects auf Socket warten?



  • Hallo,

    ich habe eine Anwendung, bei der ich gleichzeitig auf ein Event und auf einen Socket warten muss. Auf Sockets wartet man ja normalerweiße mit select(), das geht aber nicht, da ich ja auch auf ein Event warten will..

    Kann man denn den Socket auch WaitForMultipleObjects übergeben und dann damit drauf warten?

    Danke schon mal im voraus.
    Gruß pyro



  • Laut MSDN nur Event, Mutex, Process, Thread, Semaphore. Woher sollte
    WaitForMultipleObjects auch wissen auf welche Ereignisse du warten willst (read/write/accept/oob/...).

    Du könntest mal versuchen WSAEventSelect zu verwenden. Unter Win32 ist WSAEVENT einfach ein HANDLE, ich nehme an ein ganz normaler EVENT, also müsste es dann auch mit WaitForMultipleObjects gehen. (Ausprobiert hab ichs aber noch nicht)



  • Du musst WSAWaitForMultipleEvents verwenden!



  • Es geht - ich mach's selber auch so, um einerseits ein timeout für blocking sockets abfragen zu können (connect) und andererseits um mehrere threads sofort zu terminieren, wenn der Anwender die Anwendung schließt.

    z.B. wenn das timeout abgelaufen ist:
    shutdown();
    closesocket();
    event triggern (oder alternativ auf das Ende eines worker threads warten).

    Du musst eben mehrere events abfragen.

    Ist nur meine selbst erdachte Methode weil mir das Hin- und herspringen von blocking sockets zu select grundsätzlich nicht gefällt.

    Funktioniert aber auch mit 128 socket threads problemlos.



  • Also, wenn ich das WSAWaitForMultipleEvents() verwende, dann einfach die Sockets und das Event in das WSAEVENT-Array stecken und dann aufrufen, oder?

    Ansonsten EOP, hast du vielleicht ein Stück Code aus deiner Anwendung? Ich kann mir da nämlich gerade nichts drunter vorstellen.

    Danke im Voraus



  • rofl
    nein
    du musst WSAEventSelect verwenden. lies mal ein bissi die doku. und was andere leute hier schreiben. ich hab schon geschrieben dass es mit einem socket handle nicht gehen kann.



  • ResetEvent(ReceivedEvent);
    ResetEvent(FinishedEvent);
    AfxBeginThread( GetHttp, this );
    DWORD dw = WaitForMultipleObjects(2, ReceivedStopEvents, FALSE, m_timeout);
    switch (dw)
    {
    	case WAIT_TIMEOUT:				// Timeout
    		// no data received during m_timeout ms
    		CloseConnection( false );	// shutdown( not graceful ) + closesocket
    		::WaitForSingleObject(FinishedEvent, INFINITE);
    		...
    		break;
    	case WAIT_OBJECT_0 + 0:			// ReceivedEvent
    		::WaitForSingleObject(FinishedEvent, INFINITE);
    		...
    		break;
    	case WAIT_OBJECT_0 + 1:			// StopEvent
    		CloseConnection( false );
    		::WaitForSingleObject(FinishedEvent, INFINITE);
    		break;
    	default:
    		break;
    }
    
    // CDownloadThread -> ui thread
    UINT CDownloadThread::GetHttp( LPVOID p)
    {
    	CDownloadThread * me = ( CDownloadThread * )p;
    	me->GetHttp();
    	return 0;
    }
    
    void CDownloadThread::GetHttp()
    {
    	...
    	// recv
    	SetEvent( ReceivedEvent );
    	...
    	SetEvent( FinishedEvent );
    }
    

Anmelden zum Antworten