• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

CPP wielowątkowość cin>> przestaje dzialać przy użyciu tcp close()

VPS Starter Arubacloud
0 głosów
109 wizyt
pytanie zadane 30 stycznia 2023 w C i C++ przez scared Początkujący (260 p.)

Cześć,

mam problem w programie wielowątkowym cpp:

1 wątek odpowiada za zczytywanie z terminala

    void barcode_reader()
    {
        logger("Start obslugi skanera kodów");
        cout << "Podaj kod: " << endl;
        while (1) {
            cin >> g_barcode;
            cout << "Podaj kod: " << endl;
        }
    }

2 wątek jest klientem tcp:

 int tcp_client(char* arg_message) {
        int l_sock = 0, l_valread, l_client_fd;
        struct sockaddr_in l_serv_addr;
        char l_buffer[1024] = { 0 };
        if ((l_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
                    printf("\n Socket creation error \n");
            return -1;
        }

        l_serv_addr.sin_family = AF_INET;
        l_serv_addr.sin_port = htons(strtol(g_config_frontrnd_port.c_str(), NULL, 0));

        // Convert IPv4 and IPv6 addresses from text to binary
        // form
        if (inet_pton(AF_INET, g_config_frontend_ip.data(), &l_serv_addr.sin_addr)
            <= 0) {
            //        printf(
            //            "\nInvalid address/ Address not supported \n");
            return -1;
        }

        if ((l_client_fd
            = connect(l_sock, (struct sockaddr*)&l_serv_addr,
                sizeof(l_serv_addr)))
            < 0) {
                   printf("\nConnection Failed \n");
            return -1;
        }
        send(l_sock, arg_message, strlen(arg_message), 0);
        ////printf("Hello message sent\n");
        //l_valread = read(l_sock, l_buffer, 1024);
        ////printf("%s\n", l_buffer);

        //// closing the connected socket
        close(l_client_fd);
    }

 

w momencie kiedy w kliencie wykomentuje ostatnią linijke close to wtedy pierwszy wątek działa poprawnie. Ale połączenie tcp psuje się po jakimś czasie.

Czy macie jakiś pomysł jak mogę to rozwiązać?

 

komentarz 30 stycznia 2023 przez Gynvael Coldwind Nałogowiec (26,850 p.)
Czym się objawia "przestaje działać"?

Btw formalnie brakuje Ci tam odpowiedniego shutdown() przed close.

Btw2: ta funkcja tcp_client zwraca int, ale nie widzę na końcu żadnego return. Nie wędruje czasem wynik tej funkcji do jakiegoś innego close() potem? Bo tak mi to trochę wygląda.
komentarz 30 stycznia 2023 przez scared Początkujący (260 p.)

Cześć,

 

dziękuje za odpowiedz. Cin wpada w loopa jakby caly czas coś było wpisywane do konsoli:

Wynik tej finkcji już nigdzie nie wędruje. myślę że problem jest związany z linijką:

close(l_client_fd);

kiedy ją wykomentuje wątek z Cin działa poprawnie ale po jakimś czasie urywa się połączenie tcp

1 odpowiedź

+3 głosów
odpowiedź 30 stycznia 2023 przez Gynvael Coldwind Nałogowiec (26,850 p.)
wybrane 30 stycznia 2023 przez scared
 
Najlepsza
A dobra, ślepy jestem.

Nie to przekazujesz do close. Do close() przekaż to co Ci zróci socket(), a NIE to co Ci zwróci connect().

Funkcja connect() zwraca tylko kod błędu. jeśli wszystko było OK to kodem błędu jest 0. Wywołanie close(0) natomiast powoduje zamknięcie strumienia wejścia (stdin), więc cin od razu wraca (z błędem btw, ale nigdzie błędów tam nie sprawdzasz).
2
komentarz 30 stycznia 2023 przez scared Początkujący (260 p.)

Dziekuje!!!!! :D 

 

tyle czasu nad tym siedziałem! Wielkie dzieki!!!!!! yes

 

Podobne pytania

0 głosów
1 odpowiedź 1,044 wizyt
pytanie zadane 25 lipca 2016 w C i C++ przez Coroys Początkujący (370 p.)
0 głosów
1 odpowiedź 397 wizyt
0 głosów
2 odpowiedzi 303 wizyt
pytanie zadane 9 marca 2016 w JavaScript przez Śmieszek_;3 Użytkownik (780 p.)

92,455 zapytań

141,263 odpowiedzi

319,100 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...