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

winsock -problem

Ostatnio zmodyfikowano 2010-11-10 16:11
Autor Wiadomość
Ernest171
Temat założony przez niniejszego użytkownika
winsock
» 2010-11-08 07:21:00
Jak próbuje sie połączyć dwoma klientami z jednym serwerem to serwer obsługuje pierwszego klienta i dopiero po rozłączeniu tego pierwszego drugi może się komunikować. Jak zrobić aby móc połączyć się większą ilością klientów ?
P-23701
DejaVu
» 2010-11-08 13:43:35
P-23702
Ernest171
Temat założony przez niniejszego użytkownika
winsock
» 2010-11-08 15:50:02
dzięki bardzo za pomoc.
P-23704
Ernest171
Temat założony przez niniejszego użytkownika
Winsock
» 2010-11-08 17:25:41
To co mi wysłałeś jest na linuxa... :(
Więc nadal mam ten sam problem że się nie da połączyć więcej niż jednym klientem.Gdy się połączyłem jednym klientem to wszystko działa ale gdy chce drugi się połączyć to nie może dopóki ten pierwszy się nie rozłączy.
Więc jak zrobić żeby dało się większą liczbą klientów połączyć.
Proszę o pomoc.
P-23707
malan
» 2010-11-08 17:56:49
Ostatnio też nad tym myślałem, wiesz? Przymierzam się do napisania jakiś banalnych programików sieciowych i też miałem ten sam problem. Myślałem o wątkach. Czyli, dla każdego nowego klienta utworzyć osobny wątek i go (klienta) obsługiwać. Nie próbowałem tego jeszcze, ale nie wiem, czy to najlepszy pomysł.
Jednak po przeczytaniu select() -- Zsynchronizowane wielokrotne operacje I/O już wiem, że wątki są tu zupełnie nie potrzebne. W tym kursie masz wszystko czego potrzebujesz. Przeanalizuj kod, pobaw się nim trochę, napij się spritea, a wtedy sockety staną się pragnieniem :).
P-23708
DejaVu
» 2010-11-08 17:58:17
Ten kurs jest zarówno dla linuxa jak i windowsa. Na początku tego kursu jest napisane jakie są różnice w pisaniu.
P-23709
Ernest171
Temat założony przez niniejszego użytkownika
wincosk
» 2010-11-08 18:54:17
Tam jest cos takiego:

C/C++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 9034   // port, na którym nasłuchujemy

int main( void )
{
    fd_set master; // główna lista deskryptorów plików
    fd_set read_fds; // pomocnicza lista deskryptorów dla select()
    struct sockaddr_in myaddr; // adres serwera
    struct sockaddr_in remoteaddr; // adres klienta
    int fdmax; // maksymalny numer deskryptora pliku
    int listener; // deskryptor gniazda nasłuchującego
    int newfd; // nowozaakceptowany deskryptor gniazda
    char buf[ 256 ]; // bufor na dane pochodzące od klienta
    int nbytes;
    int yes = 1; // dla setsockopt() SO_REUSEADDR, patrz niżej
    int addrlen;
    int i, j;
   
    FD_ZERO( & master ); // wyczyść główny i pomocniczy zestaw
    FD_ZERO( & read_fds );
   
    // utwórz gniazdo nasłuchująceo
    if(( listener = socket( AF_INET, SOCK_STREAM, 0 ) ) == - 1 ) {
        perror( "socket" );
        exit( 1 );
    }
   
    // zgub wkurzający komunikat błędu "address already in use"
    if( setsockopt( listener, SOL_SOCKET, SO_REUSEADDR, & yes,
    sizeof( int ) ) == - 1 ) {
        perror( "setsockopt" );
        exit( 1 );
    }
   
    // bind
    myaddr.sin_family = AF_INET;
    myaddr.sin_addr.s_addr = INADDR_ANY;
    myaddr.sin_port = htons( PORT );
    memset( &( myaddr.sin_zero ), '\0', 8 );
    if( bind( listener,( struct sockaddr * ) & myaddr, sizeof( myaddr ) ) == - 1 ) {
        perror( "bind" );
        exit( 1 );
    }
   
    // listen
    if( listen( listener, 10 ) == - 1 ) {
        perror( "listen" );
        exit( 1 );
    }
   
    // dodaj gniazdo nasłuchujące do głównego zestawu
    FD_SET( listener, & master );
   
    // śledź najwyższy numer deskryptora pliku
    fdmax = listener; // póki co, ten jest największy
   
    // pętla główna
    for(;; ) {
        read_fds = master; // copy it
        if( select( fdmax + 1, & read_fds, NULL, NULL, NULL ) == - 1 ) {
            perror( "select" );
            exit( 1 );
        }
       
        // przejdź przez obecne połączenia szukając danych do odczytania
        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" );
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
   
    return 0;
}








C/C++
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

Tego brak w windowsie.
Jak zrobić żeby pod windowsem działało.
P-23710
malan
» 2010-11-08 19:20:41
Po pierwsze - zignoruj sporą ilość wszystkich nagłówków systemowych, których tu użyłem. Wszystko, co musisz dołączyć to:
C/C++
#include <winsock.h>
P-23711
1 « 2 » 3 4
Poprzednia strona Strona 2 z 4 Następna strona