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

[WinSock]Select i standardowe wejście.

Ostatnio zmodyfikowano 2015-12-11 19:37
Autor Wiadomość
Rock24
Temat założony przez niniejszego użytkownika
[WinSock]Select i standardowe wejście.
» 2015-12-11 13:44:40
Witam.
Chciałbym zastosować funkcję select w kliencie.
Na początku próbowałem wykryć naciśnięcie przycisku i tu się pojawia błąd.
Select nie czeka na wciśnięcie klawisza, tylko od razu wypisuje że deskryptor jest gotowy do odczytu. Dlacego tak się dzieje?

C/C++
fd_set desk;
fd_set desk_do_select;
FD_ZERO( & desk );
FD_ZERO( & desk_do_select );
int stdin = 0;
FD_SET( stdin, & desk );
FD_SET( gniazdo, & desk );
desk_do_select = desk;
cin.clear();
cin.sync();
select( gniazdo + 1, & desk_do_select, 0, 0, 0 );
for( int i = 0; i < gniazdo; i++ )
{
    if( FD_ISSET( i, & desk_do_select ) )
    {
        if( i == stdin )
        {
            cout << "stdin";
        }
        if( i == gniazdo )
        {
            cout << "gniazdo";
        }
    }
}


closesocket( gniazdo );
WSACleanup();
return 0;
P-141766
j23
» 2015-12-11 18:41:32
W windowsie takie rzeczy nie przejdą. select jak i generalnie reszta winsockowych funkcji (zgodnych z Berkeley sockets) operuje jedynie na deskryptorach gniazd.
P-141782
Rock24
Temat założony przez niniejszego użytkownika
» 2015-12-11 18:45:55
To jak chce zrobić klienta typu pisanie i jednoczesne odbieranie do/od serwera to pozostają tylko wątki?

Czy ogólnie pisanie serwerów pod windowsa mija się z celem, może lepiej się przesiąść na C# i ASP.Net albo pisać serwer pod linuxem a klienta w windowsie?
P-141783
j23
» 2015-12-11 19:37:43
Nie musisz od razu sięgać po wątki, możesz użyć nieblokujących socketów.


A propos funkcji select. Z racji tego, że w windowsie deskryptory mogą mieć dość wysokie numery, pętla sprawdzająca, jaką zastosowałeś, jest dość mało efektywna. Lepiej zrobić coś takiego:
C/C++
vector < SOCKET > readfds;

...

FD_SET( gniazdo1, & desk );
FD_SET( gniazdo2, & desk );
FD_SET( gniazdo3, & desk );
FD_SET( gniazdo4, & desk );


readfds.push_back( gniazdo1 );
readfds.push_back( gniazdo2 );
readfds.push_back( gniazdo3 );
readfds.push_back( gniazdo4 );

select( 0, & desk_do_select, 0, 0, 0 ); // w Win pierwszy parametr jest ignorowany

for( SOCKET s: readfds )
{
    if( FD_ISSET( s, & desk_do_select ) )
    {
        ...
    }
}
Można by bezpośrednio dłubać w strukturze fd_set, ale nie wiem, czy to zadziała, musiałbyś sprawdzić.
P-141786
« 1 »
  Strona 1 z 1