Cześć,
tworzę aplikację umożliwiającą wysyłanie i odbieranie danych po TCP/IP z wykorzystaniem notyfikatorów. Niestety w momencie wysłania danych teoretycznie dane zostają wysłane, ale połączenie ulega zamknięciu (error 66 - connection closed). Próbowałem rozwiązać problem poprzez dodanie opóźnienia w pętli "TCP sender", które pozwoli na odebranie danych przed zamknięciem połączenia.
Poniżej zamieszczam kod.
Czy problem wynika z tego, że próbuję zbyt wcześnie zamknąć połączenie zanim dane zostaną odebrane?
Wszelkie podpowiedzi mile widziane
Pozdrawiam
TCP/IP - problem z otwieraniem i zamykaniem połączenia
Re: TCP/IP - problem z otwieraniem i zamykaniem połączenia
Cześć, trop masz dobry. Owszem błąd pojawia się przez to, że połączenie zostaje zamknięte w trakcie działania tej funkcji TCP Read w dolnej pętli. Dlaczego tak się dzieje pomimo, że dodałeś opóźnienie ? Otóż Twoja funkcja read działa w trybie Standard (tryb ustawiamy tym enumem podpiętym do funkcji) i w tym trybie funkcja czeka aż nadejdzie zadeklarowana ilość bajtów lub minie czas tzw.timeout, który również możemy zadeklarować. W tym wypadku nie ma deklaracji i jest to domyślnie 25 sekund. Dlatego Twoje 2 sekundowe opóźnienie nic nie dało. Oczywiście możesz zmienić timeout w TCP Read na krótszy jednak w tym trybie możesz mieć ciągle błąd związany z nieodczytaniem wszystkich bajtów. Deklarujesz ich do oczytania 80 a ile wysyłasz nie wiemy ale zakładam, że nie taką ilość ;)
Najprościej zmienić tryb funkcji TCP Read na Immediate i wtedy program powinien zadziałać. Mam jednak obawy co do całej konstrukcji - czy koniecznym warunkiem jest zestawianie połączenia za każdym razem kiedy chcesz coś wysłać ? Pewne funkcje można by wyrzucić poza pętle i trochę zmienić "architekturę". Jeżeli masz jeszcze jakieś pytania lub chciałbyś coś tu przebudować to dawaj znać !
Najprościej zmienić tryb funkcji TCP Read na Immediate i wtedy program powinien zadziałać. Mam jednak obawy co do całej konstrukcji - czy koniecznym warunkiem jest zestawianie połączenia za każdym razem kiedy chcesz coś wysłać ? Pewne funkcje można by wyrzucić poza pętle i trochę zmienić "architekturę". Jeżeli masz jeszcze jakieś pytania lub chciałbyś coś tu przebudować to dawaj znać !
Re: TCP/IP - problem z otwieraniem i zamykaniem połączenia
Dzięki, rzeczywiście zmiana na tryb Immediate pomogła.
Masz rację, każdorazowe ustanawianie połączenia jest nadmiarowe. Będę musiał zmodyfikować architekturę
Masz rację, każdorazowe ustanawianie połączenia jest nadmiarowe. Będę musiał zmodyfikować architekturę
Re: TCP/IP - problem z otwieraniem i zamykaniem połączenia
Mam taką zagwostkę. Chciałbym, aby praca pętli była podtrzymana nawet w przypadku zamknięcia połączenia. Czy ma ktoś pomysł lub może zetknął się z problemem? Jakiś mechanizm umożliwiający podtrzymanie działania pętli mimo wystąpienia błędu dotyczącego zamknięcia połączenia?
Pozdrawiam
Pozdrawiam
Re: TCP/IP - problem z otwieraniem i zamykaniem połączenia
Spróbuj użyć funkcji Clear Error. Tutaj masz pełne kompendium wiedzy na ten temat:
https://knowledge.ni.com/KnowledgeArtic ... AS&l=pl-PL
https://knowledge.ni.com/KnowledgeArtic ... AS&l=pl-PL
Re: TCP/IP - problem z otwieraniem i zamykaniem połączenia
W sprawie przebudowy programu. Chciałbym stworzyć bufor, który umożliwia podjęcie decyzji czy transmisja ma się odbyć czy nie. Czy ma ktoś pomysł w jaki sposób taki bufor można zrobić?
Pozdrawiam
Pozdrawiam