Ernest171 Temat założony przez niniejszego użytkownika |
winsock-pakiety » 2010-11-21 18:02:19 Witam, Pakiety są różnej długości przez co mam problem z pakietami, wysyłam pakiety o rożnej długości i nie wiem jak odebrać jeden cały pakiet. Drugi problem to rozróżnianie pakietów, czasem zdarza się, że są odbierane 2 różne pakiety za jednym razem. Wysyłam tekst , i właśnie ten tekst ma różną długość.
1. Jak odebrać jeden pełny pakiet? 2. Jak odróżniać pakiety?
|
|
pekfos |
» 2010-11-21 18:14:45 2. no może wysłać w nim id? |
|
Ernest171 Temat założony przez niniejszego użytkownika |
s » 2010-11-21 18:16:52 mam np.
123/login/nick
a dokładniej?
wlaczam 2 klienty
1 minimalizuje
w 2 wysylam wiadomosci
hi
co tam?
w tym co zminimalizowalem pokaze sie:
hico tam? |
|
malan |
» 2010-11-21 19:41:56 Hm... mógłbyś pokazać kod, w którym odbierasz i wyświetlasz odebrane wiadomości? |
|
Ernest171 Temat założony przez niniejszego użytkownika |
s » 2010-11-22 07:27:56 Wysyłanie (serwer) jest z Trochę zaawansowane techniki
for( i = 0; i <= fdmax; i++ ) { if( FD_ISSET( i, & read_fds ) ) { if( i == listener ) { addrlen = sizeof( remoteaddr ); if(( newfd = accept( listener,( struct sockaddr * ) & remoteaddr, & addrlen ) ) == - 1 ) { perror( "accept" ); } else { FD_SET( newfd, & master ); if( newfd > fdmax ) { fdmax = newfd; } printf( "selectserver: new connection from %s on " "socket %d\n", inet_ntoa( remoteaddr.sin_addr ), newfd ); } } else { if(( nbytes = recv( i, buf, sizeof( buf ), 0 ) ) <= 0 ) { if( nbytes == 0 ) { printf( "selectserver: socket %d hung up\n", i ); } else { perror( "recv" ); } close( i ); FD_CLR( i, & master ); } else { for( j = 0; j <= fdmax; j++ ) { if( FD_ISSET( j, & master ) ) { if( j != listener && j != i ) { if( send( j, buf, nbytes, 0 ) == - 1 ) { perror( "send" ); } } } } } }
Odbieranie :
int recvtimeout( int s, char * buf, int len, int timeout ) { fd_set fds; int n; struct timeval tv; FD_ZERO( & fds ); FD_SET( s, & fds ); tv.tv_sec = timeout; tv.tv_usec = 0; n = select( s + 1, & fds, NULL, NULL, & tv ); if( n == 0 ) return - 2; if( n == - 1 ) return - 1; return recv( s, buf, len, 0 ); }
#define MAX_MESSAGE_SIZE 4096 char buffer[ MAX_MESSAGE_SIZE ]; ret = recvtimeout( sClient, buffer, MAX_MESSAGE_SIZE, 1 );
|
|
« 1 » |