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

[Winsock] Odbieranie wszystkich danych

Ostatnio zmodyfikowano 2012-06-14 14:12
Autor Wiadomość
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ść).


P-58406
kubawal
» 2012-06-13 18:14:54
1. » Kurs WinSock, C++Trochę zaawansowane techniki lekcja funkcja sendall() - napisz ją z użyciem recv()
2. jw. funkcja fcntl()
P-58407
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.
P-58415
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 ; ]
P-58418
PanPremium
Temat założony przez niniejszego użytkownika
» 2012-06-13 19:29:15
niestety mylisz się...
P-58420
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:
C/C++
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 ); //dodanie gniazda jednego lub później więcej
i = select( 0, & grupa_read, 0, 0, & timeout ); //właściwa funkcja
if( i == 0 ) return 0; //tutaj instrukcje gdy czas minął(lub go nie było) i nic się nie stało
else if( i == SOCKET_ERROR ) return - 1; //tutaj jakiś błąd (WSAGetLastError())

if( FD_ISSET( wsksc[ i ].Socket, & grupa_read ) ) //element i-ty cos wysyla lub cos sie innego dzieje(rozloczenie/zerwanie poloczenia)
{
    //dzialanie
}

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;
C/C++
int i;
recv( Socket,( char * ) & i, sizeof( i ), 0 );
//i pętelka odbierająca dopóki nie odbierze wszystkiego

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 :)
P-58425
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...
P-58429
hincu
» 2012-06-14 09:22:30
to napisz sobie obsluge tych protokolow...
P-58459
« 1 » 2
  Strona 1 z 2 Następna strona