• 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()

Object Storage Arubacloud
0 głosów
111 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 (27,530 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 (27,530 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,086 wizyt
pytanie zadane 25 lipca 2016 w C i C++ przez Coroys Początkujący (370 p.)
0 głosów
1 odpowiedź 402 wizyt
0 głosów
2 odpowiedzi 320 wizyt
pytanie zadane 9 marca 2016 w JavaScript przez Śmieszek_;3 Użytkownik (780 p.)

92,551 zapytań

141,400 odpowiedzi

319,531 komentarzy

61,938 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...