[WinSock]Select i standardowe wejście.
Ostatnio zmodyfikowano 2015-12-11 19:37
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? 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;
|
|
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. |
|
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? |
|
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: 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 );
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ć. |
|
« 1 » |