Netzwerk: select mit 2 Descriptoren ( socket und stdin )



  • Liebe Gemeinde,

    ich habe mir ein Bsp. aus dem Buch "Unix Netzwerkprogrammierung" genommen,
    arbeite aber mal auf Windows ab 😃

    Die Forensuche ergab ein nahezu passendes Thema vom 4 Mai 2004 wobei
    es jedoch um Socket und Pipe im SET was auf select angewendet wird ging.
    Eine Lösung war aber nicht so recht erkennbar.

    void str_cli(FILE* fp, int sockfd)
    {
    	int maxfdp1;
    	fd_set	rset;
    	DWORD dwErr;
    
    	char sendline[1024]={0}, recvline[1024]={0};
    
    	FD_ZERO(&rset);
    
    	while( 1 )
    	{
    		FD_SET(fileno(fp), &rset);
    		FD_SET(sockfd, &rset);
    		maxfdp1 = max((unsigned)fileno(fp), (unsigned)sockfd) + 1;
    
    		select(maxfdp1, &rset, NULL, NULL, NULL);
    
    		dwErr = WSAGetLastError();
    
    		if( FD_ISSET(sockfd, &rset) )
    		{
    			if( socket_readlinefast(sockfd, recvline, 1023) == 0 )
    			{
    				printf("server terminated prematurely\n");
    				return ;
    			}
    			fputs(recvline, stdout);
    		}
    		if( FD_ISSET(fileno(fp), &rset) )
    		{
    			if( fgets(sendline, 1023, fp) == NULL )
    				return;
    
    			socket_write(sockfd, sendline, strlen(sendline));
    		}
    	}
    
    }
    

    die Funktion wird mit
    str_cli(stdin, sockfd);
    aufgerufen.

    dwErr nach select liefert 10038 - Vorgang bezog sich auf ein Objekt was kein Socket ist.

    Alles klar.

    Ohne stdin in das SET mit aufzunehmen "funktioniert" es, heißt select blockiert.

    Frage ist ob select unter Windows mit stdin überhaupt klar kommt ...

    Vielen Dank.
    Schönes WE und mfg

    RB


Anmelden zum Antworten