Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

winsock-pakiety

Ostatnio zmodyfikowano 2010-11-22 07:27
Autor Wiadomość
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?


P-24267
pekfos
» 2010-11-21 18:14:45
2. no może wysłać w nim id?
P-24270
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?
P-24271
malan
» 2010-11-21 19:41:56
Hm... mógłbyś pokazać kod, w którym odbierasz i wyświetlasz odebrane wiadomości?
P-24282
Ernest171
Temat założony przez niniejszego użytkownika
s
» 2010-11-22 07:27:56
Wysyłanie (serwer) jest z » Kurs WinSock, C++Trochę zaawansowane techniki lekcja




C/C++
for( i = 0; i <= fdmax; i++ ) {
    if( FD_ISSET( i, & read_fds ) ) { // mamy jednego!!
        if( i == listener ) {
            // obsłuż nowe połączenie
            addrlen = sizeof( remoteaddr );
            if(( newfd = accept( listener,( struct sockaddr * ) & remoteaddr,
            & addrlen ) ) == - 1 ) {
                perror( "accept" );
            } else {
                FD_SET( newfd, & master ); // dodaj do głównego zestawu
                if( newfd > fdmax ) { // śledź maksymalny
                    fdmax = newfd;
                }
                printf( "selectserver: new connection from %s on "
                "socket %d\n", inet_ntoa( remoteaddr.sin_addr ), newfd );
            }
        } else {
            // obsłuż dane od klienta
            if(( nbytes = recv( i, buf, sizeof( buf ), 0 ) ) <= 0 ) {
                // błąd lub połączenie zostało zerwane
                if( nbytes == 0 ) {
                    // połączenie zerwera
                    printf( "selectserver: socket %d hung up\n", i );
                } else {
                    perror( "recv" );
                }
                close( i ); // papa!
                FD_CLR( i, & master ); // usuń z głównego zestawu
            } else {
                // mamy trochę danych od klienta
                for( j = 0; j <= fdmax; j++ ) {
                    // wyślij do wszystkich!
                    if( FD_ISSET( j, & master ) ) {
                        // oprócz nas i gniazda nasłuchującego
                        if( j != listener && j != i ) {
                            if( send( j, buf, nbytes, 0 ) == - 1 ) {
                                perror( "send" );
                            }
                        }
                    }
                }
            }
        }

Odbieranie :
C/C++
int recvtimeout( int s, char * buf, int len, int timeout )
{
    fd_set fds;
    int n;
    struct timeval tv;
   
    // ustaw zestaw deskryptorów plików
    FD_ZERO( & fds );
    FD_SET( s, & fds );
   
    // ustaw strukturę timeval dla przedawnienia
    tv.tv_sec = timeout;
    tv.tv_usec = 0;
   
    // czekaj na przedawnienie lub na odczytanie danych
    n = select( s + 1, & fds, NULL, NULL, & tv );
    if( n == 0 ) return - 2; // przedawnienie!
   
    if( n == - 1 ) return - 1; // błąd
    // danę już muszą być, więc wywołaj normalnie recv()
    return recv( s, buf, len, 0 );
}

#define MAX_MESSAGE_SIZE 4096
char buffer[ MAX_MESSAGE_SIZE ];
ret = recvtimeout( sClient, buffer, MAX_MESSAGE_SIZE, 1 );
P-24305
« 1 »
  Strona 1 z 1