2014-04-16 1 views
0

네트워크상의 세 가지 다른 컴퓨터에서 작동하는 세 가지 코드를 작성했습니다.두 프로그램이 네트워크를 통해 동기화되도록 만들기

PC1의 코드 1과 PC2의 코드 2는 PC3 (서버)의 코드 3에 2 개의 다른 데이터 패킷을 보냅니다. PC3 (서버)의 코드 3이 PC1과 PC2의 패킷을 가져 와서 XOR하여 PC 4,5,6에 멀티 캐스트합니다.

시스템은 정상적으로 작동하지만 문제가 있습니다. PC3 (Server)는 PC1과 PC2의 패킷을 차례로 가져와야합니다. 하나는 PC1에서 다음은 PC2에서입니다. 동일한 출처의 두 개의 연속 된 패킷이 시스템을 망칠 수 있습니다. 어떻게 서버를 순서대로 가져 오게 할 수 있습니까? 대부분의 패킷은 순서대로 나오지만 몇 백 개의 패킷 중 한두 번씩 건너 뛰면 시스템이 잘못된 결과를냅니다. 나는 리눅스 btw gcc를 사용하여 일하고 있습니다.

감사합니다.

+0

어떻게 네트워크를 통해 전송합니까? 시퀀스 번호로 모든 것을 태그하거나 TCP와 같은 시퀀싱을 보장하는 적절한 프로토콜을 사용하면 어떤 문제가 발생합니까? – luk32

+0

두 개의 다른 패킷 세트를 대기열로 밀어 넣을 수 있습니다 (작성해야합니다). 그리고 원하는 대기열에서 대기열로 가져갈 수 있습니다. 패킷에 시간 소인을 써야 순서가 맞는지 확인할 수 있습니다. –

+0

패킷 교환 방법은 무엇입니까? 두 개의 소켓에서 TCP가 교대로 읽을 수 있다고 해봅시다. – Prabhu

답변

0

간단한 불린 플래그가 필요한 모든 것일 수 있습니다. 마지막 패킷의 출처를 알려줍니다.

플래그를 지우고 프로그램을 시작합니다. PC1에서 패킷을 받으면 플래그를 설정하고 다음 패킷을 기다립니다. 다음 패킷이 PC2에서 왔고 플래그가 설정되어 있으면 모든 것이 정상이며 원하는 작업을 수행 한 다음 플래그를 지 웁니다.

PC1로부터 패킷을 받고 플래그가 이 아니고이 아닌 경우 시퀀스 오류가 발생합니다. PC2에서 패킷을 받고 플래그가 이 아니고이 아닌 경우 시퀀스 오류가 발생합니다.


클라이언트가 3 대 이상인 경우 간단한 일련 번호를 사용하는 것이 좋습니다. 0으로 초기화하고 PC1에서 수신하면 PC2에서 수신 할 때 2로 설정합니다. 이렇게하면 수신 된 다음 패킷이 순서대로 있는지 쉽게 알 수 있습니다.

순서가 맞지 않는 패킷을받은 경우 다시 동기화해야한다는 것을 나타내는 부울 플래그가 있습니다. 이 플래그가 설정되어있는 동안 플래그를 지우고 시퀀스 번호를 1로 재설정하면 PC1에서 다음 패킷을받을 때까지 모든 패킷을 무시합니다.

+0

이것은 가장 쉬운 방법입니다. 지금 가상 머신으로 작업 중이며 패킷은 매 몇 백 건씩 건너 뜁니다. 하지만 물리적 인 컴퓨터를 건너 뛸 때 훨씬 자주 그리고 어쩌면 두 번 이상 될 것입니다. 그런 다음 각 소스의 버퍼로 몇 가지 변수를 만들어야합니다. – BasaranBADUR

+0

@ user3541273 연결된 클라이언트가 2 대 이상인 경우보다 일반적인 솔루션이 추가되었습니다. –

+0

이것은 다른 훌륭한 아이디어입니다. 가상 시스템에서 시스템을 테스트하고 있습니다. 실제 기기를 사용할 때 동기화 오류가 너무 자주 발생하는지 여부를 제어합니다. 그들이 너무 자주 desync하지 않으면 내가 버퍼 방식으로 갈거야 만약 내가이 "재 동기화 때까지 패킷을 무시하는 플래그를 사용하여"방법을 선택하고 동기화 된 패킷으로 이동합니다. 고맙습니다. – BasaranBADUR

0

나는 모든 패킷에 번호를 붙일 것이다. 숫자는 x+N*i이고, x은 PC의 숫자이고, 예를 들어 PC1, N은 총 PC 수, i은 보낸 PC의 패킷 시퀀스 번호입니다. 꽤 간단합니다.

참고 : 0부터 번호 매기기를 시작할 수 있으며, 인수로 N-1을 사용할 수 있습니다.

이렇게하면 무작위 순서로 패킷을 받아 들일 수 있고 다중화 된 스트림에서 적절한 위치를 디코딩 할 수 있습니다. 따라서 들어오는 데이터를 버퍼링하고 손실 된 패킷을 얻을 때마다 즉시 스트림을 재구성 할 수 있습니다.

경우에 따라 PC1의 경우 홀수, PC2의 경우 홀수 여야합니다.

+0

이것은 좋은 아이디어입니다. 가상 시스템에서 시스템을 테스트하고 있습니다. 실제 기기를 사용할 때 동기화 오류가 너무 자주 발생하는지 여부를 제어합니다. 그들이 너무 자주 desync하지 않으면 나는 "재 동기화까지 패킷을 무시하는 플래그를 사용하는"방법을 선택하고 동기화 된 패킷과 함께 갈 경우이 방법으로 갈 것입니다. 고마워요 :) – BasaranBADUR

0

PC3은 PC1과 PC2로부터 패킷을 요청할 수 있습니다. PC [1/2]는 요청시에만 패킷을 보냅니다. PC3은 PC1에서 패킷을 요청하고 기다리고 PC2에서 패킷을 요청한 다음 X2를 기다리고 XOR을 기다립니다.

장점 : 결과가

+0

이것은 정말 견고한 생각이지만, 나는 그것이 내가 원하는 것보다 더 시스템을 느리게 할 것이라고 생각합니다. 나는이 시스템이 고전적인 유니 캐스트보다 더 빠르다는 것을 보여줄 필요가있다. – BasaranBADUR

0

당신이 모든 기계에 대한 모든 패킷을 처리 할 것으로 예상하지 않겠 조금 느린 필요한 더 많은 코드 : 당신이 어떤 순서 오류가되지 않습니다, 모든

단점을 제어? 그렇다면 각 연결에 대해 패킷 대기열을 설정 한 다음 순서대로 대기열을 처리해야 할 수도 있습니다. 빈 큐를 처리 할 때, 그냥 앉아서 다음 패킷이 도착할 때까지 기다린다. 시퀀스 오류 솔루션 (부울 값 포함)을 사용하면 두 컴퓨터 사이의 사소한 지연으로 인해 오류 상태가 표시되며, 대기열을 들여다 보면 실사가 제공됩니다 ... 대기열을 너무 많이 성장시키지 않으려면 각 연결에 대한 최대 대기열 크기를 정의해야합니다.

관련 문제