PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : timeout bei socketverbindung?



TheDodger
17-06-2004, 04:44
Moin moin!

Ich habe (mal wieder ;) ) ein sehr ... seltsames? ... Problem.
Ich versuche z.Z. einen Netzclient in reinem C zu schreiben.
Dieser soll Connects zu mehreren Ports aufnehmen und mir nur mitteilen, ob das funktioniert hat.
wenn ich das so mache, klappen fast alle Ports:


int numbytes;
char buf[MAXBUF];

if( ( numbytes = recv( m_socket, buf, MAXBUF - 1, 0 ) ) == -1 ) {

perror( "recv" );
exit( 1 );
}

buf[ numbytes ] = '\0';

printf( "Received: %s", buf );


Fast ... denn bei 993 (IMAPs) hängt das ganze bei recv() und geht nicht weiter.
Kleiner Implementierungsfehler ... ich hab ja auch keinen Timeout genutzt.

Dazu das hier:


struct timeval tv;
fd_set readfds;

tv.tv_sec = 4;
tv.tv_usec = 500000;

FD_ZERO( &readfds );
FD_SET( pSocket, &readfds );

select( 1, &readfds, NULL, NULL, &tv );

if( FD_ISSET( pSocket, &readfds ) == false ) {

printf( "Timed out.\n" );
return( false );
} else {

printf( "daaaaten ;)\n" );
}

Da ist es egal, welchen Port ich connecte, ich bekomme immer einen Timeout. :(

Kann mir bitte mal jemand den Wald vor meinem Kopf entfernen? :cool:

TheDodger
17-06-2004, 05:52
Das Problem besteht bei diesem Code nicht mehr:


struct timeval tv;
fd_set rset;

tv.tv_sec = 4;
tv.tv_usec = 500000;

FD_ZERO( &rset );
FD_SET( pSocket, &rset );

int r = FD_ISSET( pSocket, &rset );

if( r > 0 ) {

select( pSocket+1, &rset, NULL, NULL, &tv );

if( FD_ISSET( pSocket, &rset ) ) {

int numbytes;
char buf[MAXBUF];

if( ( numbytes = recv( pSocket, buf, MAXBUF - 1, 0 ) ) == -1 ) {

perror( "recv" );
exit( 1 );
}

buf[ numbytes ] = '\0';
printf( "Received: %s", buf );

} else {

printf( "Timed out.\n" );
}
}

return;


Wieder was gelernt ... :-)