PanPremium Temat założony przez niniejszego użytkownika |
[Winsock] Odbieranie wszystkich danych » 2012-06-13 18:10:40 Witam, próbuje napisać w winsocku funkcje która dobiera wszystkie dane, jednak za bardzo mi to nie wychodzi.
1.Mógłby ktoś podać taką funkcje?
2.Co zrobić, żeby funkcja recv nie blokowała całej aplikacji gdy czeka na dane(niechodzi o wielowątkowość).
|
|
kubawal |
» 2012-06-13 18:14:54 |
|
PanPremium Temat założony przez niniejszego użytkownika |
» 2012-06-13 18:53:00 1. Funkcja send zwraca ilość wysłanych danych, mając to info oraz info ile danych wysyłamy można to zrobić.
Funkcja recv zwraca ilość odebranych danych w jednym pakiecie nie mamy informacji ile danych jeszcze pozostało a jak pamiętamy recv się blokuje.
2. To jest funkcja pod linuxa na windowsie nie ma takiej funkcji. |
|
hincu |
» 2012-06-13 19:10:50 musisz zrobic sobie strukture pakietu i na 1 miejscu rozmar tego pakietu ; ], pozniej wczytuj po 1 bajcie i napisz interpreter pakietow tak ze zawsze pierwsze 3 bajty pakietu to rozmiar strinstreamem sie pobaw. a pozniej petelke i wczytujesz wszystkie bajty po koleji, chyba ze to sa jakies wieksze liczby ; ], mozna to roznie przedstawic w kodziem zreszta pisanie protokolu gry od 0 to jest troche roboty ; ] |
|
PanPremium Temat założony przez niniejszego użytkownika |
» 2012-06-13 19:29:15 niestety mylisz się... |
|
Admixior |
» 2012-06-13 20:50:22 Żeby się nie blokował program trzeba sprawdzić funkcją select() czy czegoś nie ma na jednym lub więcej gniezdzie. W winsocku się to robi tak: fd_set grupa_read; timeval timeout; timeout.tv_sec = 300; timeout.tv_usec = 0; int i; FD_ZERO( & grupa_read ); FD_SET( wsksc[ i ].Socket, & grupa_read ); i = select( 0, & grupa_read, 0, 0, & timeout ); if( i == 0 ) return 0; else if( i == SOCKET_ERROR ) return - 1;
if( FD_ISSET( wsksc[ i ].Socket, & grupa_read ) ) { }
jeżeli do funkcji select zamiast struktury timeval wyślesz null lub wartości w tej strukturze ustawisz na 0 to nie będzie w ogóle czekać i odrazu bedziesz miał czy coś jest. Co do wysyłania wszystkich danych to masz wybór, albo zmienić na UDP (nie będziesz ciągle wiedział czy ktoś przypadkiem nie zerwał połączenia, dopiero po TIMEPING) albo zrobić funkcje z np vektorem i tak jak koledzy wyżej pisali jakiś do tego interpreter :) przez stringstream; int i; recv( Socket,( char * ) & i, sizeof( i ), 0 );
Należy też zauważyć że tcp/ip może czasami połączyć ci 2 pakiety, a ty odczytasz je w jeden, dlatego raczej jest polecane żebyś wysyłał rozmiar. Albo utworzył stały rozmiar pakietu w którym masz bajt po bajcie klase (gracz;typ;flagi;stałego rozmiaru widomość) //mam nadzieje że dobrze zrozumiałem temat :) |
|
PanPremium Temat założony przez niniejszego użytkownika |
» 2012-06-13 21:50:50 Należy też zauważyć że tcp/ip może czasami połączyć ci 2 pakiety, a ty odczytasz je w jeden, dlatego raczej jest polecane żebyś wysyłał rozmiar. |
Kwestia taka, że to nie ja wysyłam tylko serwer SMTP, POP3... |
|
hincu |
» 2012-06-14 09:22:30 to napisz sobie obsluge tych protokolow... |
|
« 1 » 2 |