news
2006-03-18 14:45:17 UTC
Witam
Chicialbym na lamach grupy dyskusyjnej poruszyc temat gniazdek sieciowych
nad ktorym glowie sie od jakiegos juz czasu.
Napisalem klienta na platformie AS/400 ( w jezyku ANSI C ) ktory wywoluje
polaczenie do Serwera napisanego na platformie Windows XP ( w jezyky VC++
6.0).
W ramach tego polaczenia opracowanym protokolem ( w modelu OSI to bedzie
chyba 'protokol aplikacji ;)) przekazuje dane ( kody produktow, ceny,
ilosci...etc...) do serwera po stronie Windowsa.
Serwer odbiera i formatuje odpowiednio przekazujac to na drukarke fiskalną.
Transmisja pomiedzy klientem a serwerem dziala w oparciu o funkcje sieciowe
send(), recv(), gniazdko jest skonfigurowane w kliencie w trybie blokujacym
na serwerze zas dzialaja w oparciu o MFC ( komunikaty systemu Win.):
Gdy klient wysyla send() wtedy serwer wykrywa to zdarzeniem OnRecv() w
tej metodzie rozpoznaje poszczegolne sekwencje protokolu, rpozpoznaje je i
odroznia od danych....etc...
Schemat klarowny i prosty ale niestety nie funkcjonuje tak jakbym sobie tego
zyczył.
Mianowicie kiedy klient wysle jakis lancuch np: 256 bajtów - serwer dobiera
odsyła potwierdzenie odbioru.
Tutaj pojawia sie problem funkcja recv() od klienta ustawiona w trybie
blokowym czeka i nie moze sie doczekac na odpowiedz od serwera.
Dopiero napisana funkcja Timeout() zwlania ten socket po uplywie jakiegos
czasu.
Sytulacja jest o tyle dziwna ,ze nie ma jakiejs logicznej zaleznosci (a moze
jest tylko ja nie potrafie ja wysledzic) wszystko dziala jak nalezy, a raz
na jakis czas powstaja "zwisy" na funkcji recv() (strona klienta).
Czego to moze byc wina , czy stos TCP ma tutaj jakies znaczenie, czy powinno
sie go jakos czyscic,zerowac...a moze to wina czegos innego?
Pozdrawiam i czekam na jakas sugestie , podpowiedz od Was.
Maciek
Chicialbym na lamach grupy dyskusyjnej poruszyc temat gniazdek sieciowych
nad ktorym glowie sie od jakiegos juz czasu.
Napisalem klienta na platformie AS/400 ( w jezyku ANSI C ) ktory wywoluje
polaczenie do Serwera napisanego na platformie Windows XP ( w jezyky VC++
6.0).
W ramach tego polaczenia opracowanym protokolem ( w modelu OSI to bedzie
chyba 'protokol aplikacji ;)) przekazuje dane ( kody produktow, ceny,
ilosci...etc...) do serwera po stronie Windowsa.
Serwer odbiera i formatuje odpowiednio przekazujac to na drukarke fiskalną.
Transmisja pomiedzy klientem a serwerem dziala w oparciu o funkcje sieciowe
send(), recv(), gniazdko jest skonfigurowane w kliencie w trybie blokujacym
na serwerze zas dzialaja w oparciu o MFC ( komunikaty systemu Win.):
Gdy klient wysyla send() wtedy serwer wykrywa to zdarzeniem OnRecv() w
tej metodzie rozpoznaje poszczegolne sekwencje protokolu, rpozpoznaje je i
odroznia od danych....etc...
Schemat klarowny i prosty ale niestety nie funkcjonuje tak jakbym sobie tego
zyczył.
Mianowicie kiedy klient wysle jakis lancuch np: 256 bajtów - serwer dobiera
odsyła potwierdzenie odbioru.
Tutaj pojawia sie problem funkcja recv() od klienta ustawiona w trybie
blokowym czeka i nie moze sie doczekac na odpowiedz od serwera.
Dopiero napisana funkcja Timeout() zwlania ten socket po uplywie jakiegos
czasu.
Sytulacja jest o tyle dziwna ,ze nie ma jakiejs logicznej zaleznosci (a moze
jest tylko ja nie potrafie ja wysledzic) wszystko dziala jak nalezy, a raz
na jakis czas powstaja "zwisy" na funkcji recv() (strona klienta).
Czego to moze byc wina , czy stos TCP ma tutaj jakies znaczenie, czy powinno
sie go jakos czyscic,zerowac...a moze to wina czegos innego?
Pozdrawiam i czekam na jakas sugestie , podpowiedz od Was.
Maciek