2012-10-31 11 views
5

Napisałem jednego klienta SSL przy użyciu interfejsów API OpenSSL do interakcji z jednym serwerem SSL. W witrynie OpenSSL dowiedziałem się, że bufor zapisu musi zostać przepłukany po zapisaniu niektórych danych. Używam SSL_Write i SSL_Read w moim programie klienta. Ponieważ strona OpenSSL zasugerowała, że ​​próbowałem spłukać dane przy użyciu BIO_flush (BIO *), mam tu awarię.Czy istnieje sposób na opróżnienie bufora zapisu SSL

używam biblioteki SSL dostał od this site

Tutaj nie jestem jasne, czy BIO_flush miga bufor odczytu lub zapisu bufora .. :-( Więc chciałem po prostu wiedzieć, czy istnieje jakieś inne sposoby opróżnić bufor zapisu SSL ...?

Oto szczegóły na temat mojego programu klienckiego.

  1. Tworzenie obiektu SSL (mSsl) używając SSL_new
  2. Crea ting gniazdo TCP i dokonując połączenia z serwerem
  3. Tworzenie obiektu BIO (mBio) używając BIO_new_socket (socket_id, BIO_NOCLOSE)
  4. Ustawianie obiektu BIO do obiektu przy użyciu protokołu SSL (mSsl SSL_set_bio, mBio, mBio);
  5. Ustawianie gniazda do obiektu SSL za pomocą SSL_set_fd (mSsl, socket_id);
  6. Nawiązywanie połączenia SSL z serwerem za pomocą SSL_Connect (mSsl);

Po wykonaniu powyższych kroków uruchamiam dwa oddzielne wątki do zapisu i odczytu. Napisz wątek używa SSL_write do zapisu danych na serwer, a wątek do odczytu używa SSL_Read do odczytania danych z serwera.

W Napisz wątek po napisaniu każdego pakietu za pomocą SSL_Write Dzwonię BIO_flush (mBio).

W całym programie bezpośrednio korzystam z obiektu mBio tylko w tym miejscu, aby wykonać bufor biologiczny.

Kiedy zacznę wysyłać niektóre pakiety, program się zawiesza w BIO_flush ... Jak na zrzucie mówi to w funkcji BIO_ctrl. Nie dostaję nic więcej.

Czy ktoś użył biblioteki, której link podałem powyżej i napotkałem ten sam problem ..? Jeśli tak, daj mi znać, jeśli znasz rozwiązanie.

Czy są jakieś reguły synchronizacji wątków, aby używać BIO_flush() ...? Mam na myśli połączenie z BIO_flush SSL_Read nie powinno się wydarzyć w tym samym czasie ...?

Odpowiedz

2

BIO_flush służy do opróżniania zapisanych danych.

Twój mix i dopasowanie BIO_flash i SSL_read/write jest problematyczny, ponieważ struktura BIO nie jest świadoma twoich połączeń SSL_read/write.

Osiągniesz znacznie lepsze wyniki dzięki użyciu BIO_read/write.

Jeśli bezwzględnie potrzebujesz używać SSL_read/write, powinieneś unikać używania BIO.

Myślę, że otrzymasz znacznie więcej informacji na ten temat na końcu tej dokumentacji OpenSSL.

Simple OpenSSL Client Example

Jeśli nadal się zawiesza podczas próby tego przykładem, może być problemy z danej biblioteki budować używasz.

6

Skąd się dowiedziałeś, że bufor zapisu będzie musiał zostać przepłukany po zapisaniu?

Szukałem również funkcji spłukiwania, ale nie mogłem jej znaleźć.

Myślę, że działa to w ten sposób: każde wywołanie funkcji SSL_write generuje co najmniej jeden rekord protokołu SSL i wysyła go do gniazda, gdzie algorytm zajścia na gorę może je buforować w kernelu i szybko przesłać go na zewnątrz.

Tak więc nie ma buforowania w SSL_write, a zatem nie ma koloru!

Wolę mieć funkcję spłukiwania i wypełnić wszystkie rekordy SSL po brzegi, ale nie jest to możliwe, o ile widzę. Teraz planuję wykonać własne buforowanie i wykonywać tak duże połączenia z SSL_write, jak to możliwe.

BTW: Właśnie napisałem mały program testowy: wysyła bufor z jednym napisem, a następnie uruchomiłem go ponownie, wywołując SSL_write dla każdego znaku. Za każdym razem uruchamiam tcpdump iw Wireshark widziałem, że pierwszy przebieg miał kilka dużych rekordów danych aplikacji, a drugi przebieg miał wiele małych rekordów. Więc myślę, że to jest potwierdzone.

Powiązane problemy