2011-02-09 8 views
5

Sytuacja wygląda następująco: Mam aplikację Java, która komunikuje się przez TCP z mikrokontrolerem z stosem TCP. Stos na kontrolerze działa dobrze, mogę to rozwiązać.Java Sockets: Socket.close() kończy się inaczej w systemach Windows i Mac?

Problem: Kiedy kończę połączenie ze sterownikiem, po prostu używam socket.close(), a połączenie jest zakończone, bez problemu. Na moim Macu też to działa, ale kiedy sprawdzam Wiresharka, następuje regularny proces kończenia połączenia: [FIN,ACK] - [ACK], ale po nim następuje pakiet [TCP Dup ACK], który, jak twierdzi Wireshark, należy do mojego pakietu [FIN,ACK]. Dzieje się tak tylko na komputerze Mac i nie występuje na komputerze z systemem Windows w maszynie wirtualnej na moim komputerze Mac lub na moim netbooku ...

Czy są jakieś poprawki, których mogę użyć, aby nie przekazać tego pakietu Dup-ACK do przesłania? W rzeczywistości podciąga stos w kontrolerze, twierdząc, że zamknięta sesja jest nadal aktywna i po 10-krotnym podłączeniu do kontrolera, stos nie ma więcej miejsca, aby zaakceptować nowe połączenia.

Byłbym bardzo wdzięczny, gdyby ktoś mógł dać mi wskazówkę!

+0

Która wersja Mac OS? – Daniel

+0

Mac OS 10.6.6, Java wersja 1.6.0_22 –

Odpowiedz

0

Właściwie poleciłbym rozmowę z dostawcą twojego stosu tcp/ip twojego MCU.

Chociaż możesz poprawić ten jeden konkretny mac, będziesz musiał poprawić to na stałe. Jest tam wystarczająco dużo macek, że będziesz musiał sobie z tym poradzić wcześniej czy później.

+0

Zmodyfikowałem niektóre procedury, aby automatycznie usuwać nieaktywny wpis połączenia. Nadal interesujące, że java zachowuje się tak inaczej w tym przykładzie na Macu niż na maszynach Windows ... –

1

Cóż, jeśli jest to problem w stosie TCP dostarczanym przez OS (co moim zdaniem jest), możesz spróbować telnetować się z komputera Mac na urządzenie i zamknąć połączenie. Tylko po to, aby zobaczyć, czy to dup ack nadal będzie emitowane. Jeśli tak jest, to zamiana wersji/producentów java na przykład nie przyniesie wiele dobrego ...

... oh, a może będziesz mógł filtrować naruszający pakiet za pomocą zapory? To dzikie domysły, ponieważ właściwie nic nie wiem o zaporze ogniowej dla MacOS ...

Powiązane problemy