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

[winsock] problem z łączeniem się klientów do serwera

Ostatnio zmodyfikowano 2012-08-06 13:59
Autor Wiadomość
kubawal
Temat założony przez niniejszego użytkownika
[winsock] problem z łączeniem się klientów do serwera
» 2012-08-04 21:45:03
Witam!

Ostatnio chciałem sobie napisać serwer podobny do tego z kursu (» Kurs WinSock, C++Trochę zaawansowane techniki lekcja)
Oto kod:
C/C++
int main()
{
    //inicjalizacja winsock
    WSADATA wsadat;
    WSAStartup( MAKEWORD( 2, 2 ), & wsadat );
   
    //zmienne
    sockaddr_in my_addr;
    SOCKET listener; // nasz SOCKET
    SOCKET max_fd;
    SOCKET new_fd;
    int addrlen = sizeof( sockaddr_in );
    fd_set all_fds, read_fds;
    sockaddr_in new_addr;
   
    char comm_buf[ 7 ];
    FD_ZERO( & all_fds ); FD_ZERO( & read_fds );
   
    //inicjalizacja gniazda
    if(( listener = socket( AF_INET, SOCK_STREAM, 0 ) ) == - 1 )
    {
        perror( "socket" );
        exit();
    }
    FD_SET( listener, & all_fds );
    max_fd = listener;
    my_addr.sin_family = AF_INET;
    my_addr.sin_addr.s_addr = htonl( INADDR_ANY );
    my_addr.sin_port = htons( PORT );
    memset( & my_addr.sin_zero, '\0', 8 );
    if( bind( listener,( sockaddr * ) & my_addr, sizeof( my_addr ) ) == - 1 )
    {
        perror( "bind" );
        exit();
    }
   
    //rozpoczynamy nasłuchiwanie
    if( listen( listener, 10 ) == - 1 )
    {
        perror( "listen" );
        exit();
    }
   
    while( true ) // główna pętla nasłuchująca
    {
        read_fds = all_fds;
        if( select( max_fd + 1, & read_fds, NULL, NULL, NULL ) == - 1 )
        {
            perror( "select" );
            exit();
        }
       
        for( int i = 0; i < max_fd; i++ )
        {
            if( FD_ISSET( i, & read_fds ) ) // mamy gniazdo, które coś wysłało
            {
                if( i == listener ) // nowe połączenie
                {
                    if(( new_fd = accept( i,( sockaddr * ) & new_addr, & addrlen ) ) == - 1 )
                    {
                        perror( "accept" );
                        exit();
                    }
                    FD_SET( new_fd, & all_fds );
                    if( new_fd > max_fd ) // śledź największy SOCKET
                         max_fd = new_fd;
                   
                    cout << "Nowe połączenie z " << inet_ntoa( new_addr.sin_addr ) << " na gnieździe " << new_fd << endl;
                }
                else
                {
                    recv( i, comm_buf, 7 - 1, NULL );
                    if( CommandExecute( comm_buf, i ) == 3 )
                    {
                        closesocket( i );
                        FD_CLR( i, & all_fds );
                        cout << "Gniazdo " << i << " zakończyło połączenie\n";
                    }
                   
                }
            }
        }
       
       
       
       
    }
    //czyścimy winsock
    WSACleanup();
    return 0;
}

Problem jest taki, że gdy klient próbuje się połączyć, to serwer nie reaguje.
Z góry dziękuje za pomoc.
P-61766
RazzorFlame
» 2012-08-05 12:47:31
A podłączasz clienty do dobrego portu?
BTW. tu masz dobry bardzo kurs winsock (nie przecze ze tu tez jest super):
http://win32developer.com
P-61781
pekfos
» 2012-08-05 12:49:14
Port odblokowany?
Komputery są w sieci lokalnej?
Podajesz prawidłowy adres?
Jeśli nie są w sieci lokalnej: Dodałeś reguły NAT do ustawień routera?
P-61782
kubawal
Temat założony przez niniejszego użytkownika
» 2012-08-06 08:07:36
1.Tak
2.Nie tylko
3.Nie muszę podawać adresu, to klienci muszą znać mój adres;
4.Nie mam routera.
P-61831
DejaVu
» 2012-08-06 13:59:17
Odpal najpierw serwer i klienta na swoim komputerze - jak będzie działało to dopiero wznów dyskusję. Obecnie nie ma czego diagnozować.
P-61849
« 1 »
  Strona 1 z 1