[winsock2.h] close() vs closesocket() vs shutdown()

0

Zacząłem właśnie zabawę z biblioteką winsock2.h. Wiadomo że na początku należy napisać komunikator, więc tak też zrobiłem [green] Po drodze przezwyciężyłem wiele problemów, najgorsze było to, że korzystałem z kursu na linuxa, a programowałem na windows. Moje pytanie dotyczy funkcji close() closesocket() i shutdown(). W zasadzie to close() mnie nie interesuje bo pod windowsem jej i tak nie ma, jest za to closesocket(), która według kursu (http://www.pradnik.net/netman/syscalls.html#closedown) powinna być równoważna:
closesocket(jakiś_socket) == shutdown(jakis_socket,2)
Niestety - za pomocą funkcji recv przekonałem się, że closesocket() nie zamyka połączenia tak jak shutdown(). Sprawdzałem sobie to co zwraca recv, które przy błędzie zwraca -1 a gdy druga strona zamknie poprawnie połączenie to powinno zwracać 0. Jednak po zamknięciu socketa funkcją closesocket() zawsze dostawałem -1, natomiast gdy w końcu spróbowałem shutdown() okazało się że jest ok i działa jak trzeba. Pytanie jest - czy w takim razie mam zapomnieć o closesocket() z powodu słabej funkcjonalności i zostać przy shutdown()? Czy może ja coś źle robię, no ale gdzie tu można się pomylić [???]

do{
            rec=recv(polaczony,rcv_msg,99,0);
            if(rec==-1){
            perror("recv");
            WSACleanup();
            break;
            }
            else if (rec==0){
            cout<<"\nKlient zerwal polaczenie.";
            WSACleanup();
            break;
            }
            if (send(polaczony,rcv_msg,99,0)==-1){
            perror("send");
            WSACleanup();
            break;
            }
            } while(rcv_msg!="exit");              

Edit: Właśnie sobie dalej testuję ten mój program i już znów jest źle nawet jak używam shutdown [???] Co jest grane [diabel]

Edit2: Rozwiązałem swój problem [glowa] W kliencie zaraz po zamknięciu socketa miałem od razu WSACleanup() co powodowało, że czasem połączenie zamykało się tak jak trzeba a czasem od razu leciał ceanup i serwer wyświetlał błąd zamiast komunikatu [browar] W związku z tym wszystkie moje wcześniejsze dywagacje na temat nie zwracania przez closesocket() wartości 0 przy rozłączeniu się klienta są bez sensu i można zamknąć ten temat [wstyd] closesocet działa jak powinien.

0

A czy komunikator napisałeś w oparciu o protokół UDP czy TCP? Do komunikatora w sieci LAN lepiej nadaje się UDP gdzie nie ma połączenia.
zajrzyj na:
http://paprykarz.org/dat/kursy/kursc/www.keeller.kompozytor.net/ws_wprowadzenie.html
Jest tam mały kurs do winsocketów.
Napisz więcej kodu.

0

Dzięki za linka, fajny kurs, szkoda że znaki zapytania ma zamiast polskich znaków :| Ale przeczytaj mojego pierwszego posta do końca, problemem jest już rozwiązany, natomiast komunikator (o ile można tak go nazwać) ma działać nie tylko po lanie więc chodzi po TCP/IP

0

Trzeba zmienić kodowanie znaków. W Firefoxie Widok > Kodowanie znaków > Środkowoeuropejski

0

Rzeczywiście, działa, dziękuję

1 użytkowników online, w tym zalogowanych: 0, gości: 1