문제

우리는 두 개의 큰 문자열 (각각 수백 자)가 TCP를 사용하여 다른 쪽 끝에 다른 쪽 끝에 나타나는 두 개의 큰 문자열 (각각 수백 자)에 기괴한 문제가 있습니다. 이것은 매우 드물게 발생합니다.

각 문자열은 LF로 종료 된 완전한 XML 메시지이며 일반적으로 읽기 프로세스는 전체 XML 메시지를 읽고 LF를 볼 때 반환됩니다.

실제로 메시지를 보내는 호출은 IOHandler의 Writeln 메소드에 대한 호출 주변의 임계 섹션으로 보호되므로 두 스레드가 동시에 보낼 수 없습니다. (우리는 중요한 섹션이 제대로 구현/작동한다고 확신합니다). 이 문제는 거의 거의 발생하지 않습니다. 증상은 홀수입니다 ... 우리가 문자열 A 뒤에 문자열 B를 보낼 때 우리가 다른 쪽 끝에서받은 것 (우리가 실패가있는 드문 경우)은 문자열 A 자체의 후행 섹션입니다 (, 끝에는 lf가 있습니다.) 다음은 문자열 A의 주요 섹션과 전체 문자열 B 뒤에 단일 LF가 있습니다. 우리는 부분적으로 읽은 후 "타임 아웃"속성이 사실이 아니라는 것을 확인했습니다. 컨텐츠를 반환하는 모든 읽기 후에 해당 속성을 기록합니다. 또한, 우리는 문자열에 내장 된 LF 문자가 없다는 것을 알고 있습니다. 우리는 LF를 추가하고 보내기 전에 문자열의 모든 비 알파 너매 문자를 공백으로 명시 적으로 교체하기 때문입니다.

전송 및 수신 끝 모두에서 중요한 섹션 내부에 로그 메커니즘이있어 "와이어"에서이 동작을 볼 수 있습니다.

우리는이 문제를 일으킬 수있는 낮은 수준의 인디 문제가있을 수 있는지 여부를 완전히 당황스럽고 궁금합니다. 예를 들어, 버퍼는 잘못된 순서로 전송됩니다 .... 이것이 문제가 될 수 있다고 믿기가 매우 어렵지만 우리는 빨대를 잡고 있습니다.

누구든지 밝은 아이디어가 있습니까?

도움이 되었습니까?

해결책

수신 끝에서 동시에 같은 소켓에서 여러 스레드를 읽는 데 여러 스레드가 있습니까? Connected () 상태를 쿼리하기 위해서도 읽기가 발생합니다. 이로 인해 여러 스레드가 인바운드 데이터를 읽고 IoHandler.InputBuffer에 저장할 수 있습니다.

다른 팁

당신은 시도 할 수 있습니다 Wireshark 데이터가 어떻게 변하는 지 알아 내기 위해. 이렇게하면 문제가 서버 또는 클라이언트에 있는지 확인할 수 있습니다. 또한 TCP를 사용하여 올바른 순서로 "보장 된"유효한 데이터를 얻는 것을 잊지 마십시오.

TCP 또는 UDP를 사용하고 있습니까? UDP를 사용하는 경우 UDP 패킷을 네트워크를 가로 지르는 라우팅으로 인해 전송 된 것과는 다른 순서로 수신 할 수 있습니다. 이 경우 수신기가 패킷을 올바르게 주문할 수 있도록 각 UDP 패킷에 일종의 패킷 ID를 추가해야합니다.

당신은 확인 했습니까? nagle iohandler 설정? 우리는 Usenagle을 False로 설정하여 고칠과 비슷한 문제가있었습니다. 우리의 경우 버스트에서 많은 양의 데이터를 보내거나받는 것은 Nagle Coalescing으로 인해 느 렸기 때문에 상황과는 다릅니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top