2011-01-06 2 views
0

몇 가지 기본적인 TCP 통신을 수행했지만 몇 가지 질문이 있습니다. 우리는 트랜잭션 흐름을 설명하는 TCP 서버와 통신하는 것은 다음과 보낸 사람은 STX (아스키는 0x02) 문자를 전송하여 거래 을 시작직렬 통신을 위해 프레임 된 메시지 송수신 .Net 소켓

, 다음 받는 사람이를 보내 답장을 기다립니다 ACK (ASCII 0x06) 문자. ACK를 가 수신되면, 송신기는 페이로드 뒤에 메시지 페이로드의 크기를 나타내는 4 바이트 부호없는, 빅 엔디안 정수를 송신하고, 최종적으로 16 바이트 MD5 메시지 다이제스트 유효 탑재량. 받는 사람이 메시지에 만족하면 ACK 문자를 보냅니다.

<STX> = ASCII 0x02 
<ACK> = ASCII 0x06 

Sender: <STX>  <0x00><0x00><0x00><0x05><'H'><'E'><'L'><'L'><'O'><0xEB><0x61>... 
Recipient: <ACK>                <ACK> 

사용 닷넷 소켓 (을 System.Net.Sockets.Socket)은 STX/ACK 전송 제어를 관리하는 적절한 방법은 무엇인가? 소켓이 자동으로 처리합니까 (예 : socket.Send (byteData)를 간단히 호출합니까), 명시 적으로 STX를 보내고 ACK를 기다려야합니까?

받는 사람도 마찬가지입니다. 들어오는 데이터를 수신하거나 STX 문자를 수신하고 ACK를 보내고 페이로드를 준비해야합니까?

전송 제어가 자동으로 처리되는 경우 설정해야하는 특정 소켓 플래그가 있습니까?

는 참고 : 우리는 메시지 프레임에 유용한 입증 (다음과 같이) 몇 가지 링크를 찾았지만, 그럼에도 STX/ACK 전송 제어 논의하지 :

답변

2

Hehe는 직렬 포트 프로토콜 이었지만 대신 소켓을 사용하기 위해 그대로 옮겼습니다. TCP 구현과 같은 스트림에는 적합하지 않지만 드물지 않습니다.

글쎄, 지침을 따르십시오. 당신이 클라이언트라고 가정하면, 1 바이트를 읽고 그 값이 0x02인지 확인하십시오. 그렇다면 1 바이트 0x06을 돌려 보내십시오. 그렇지 않다면 0x02가 보일 때까지 계속 읽으십시오. 이제 당신은 '연결되어 있습니다',하지만 당신은 이미 그것을 알고있었습니다.

다음으로 4 바이트를 읽으면 패킷 길이를 알 수 있고, 나머지 바이트는 2 바이트만큼 읽음으로써 나머지 패킷을 얻을 수 있습니다. 나는 'MD5 다이제스트 (MD5 digest)'를 무시할 것이고, TCP는 수신 된 데이터의 유효성을 재확인 할 필요가 없을만큼 충분히 신뢰할 만하다. 1 바이트, 0x06을 돌려 보내십시오.

명확하지 않은 유일한 것은 패킷 길이 앞에 0x02가 있어야하는지 여부입니다. 본문은 당신이하지 않는다고 말하며, 다이어그램은 그러하다고 말합니다.

+0

우리는 ACK를받을 때까지 STX를 보내고 길이 + 페이로드 + MD5를 전송하고 다른 ACK를받을 때까지 기다린 다음 "보내기"를 완료 할 때까지이 메서드를 구현했습니다. 문제는 그것이 동기 프로세스에 있다는 것입니다. 이 작업이 완료되기까지 오래 걸리지는 않지만 ACK를 기다리는 동안 유사한 데이터를 수신해야 할 수도 있습니다.비동기로이 작업을 수행하는 가장 좋은 방법은 무엇입니까? –

+0

Socket.BeginReceive()를 사용하십시오. –

+0

비동기 소켓을 수행하는 방법을 알고 있습니다. 핸드 셰이크를 비동기 적으로 처리하는 최선의 방법이 아닙니다. 콜백을 받으면 수신 된 데이터를 기반으로 전송을 트리거해야합니까, 아니면이를 수행하는 더 좋은 방법이 있습니까? 예 : ACK가 수신되면 다음 항목을 전송 대기열에 보냅니다. STX가 수신되면 ACK를 보냅니다. 페이로드가 수신되면 ACK 등을 보냅니다. –

2

TCP 알고하지 않습니다 귀하의 응용 프로그램 수준 프로토콜에 대해. TCP 소켓은 양방향 바이트 스트림입니다. 명시 적으로/STXACK 바이트를 보내거나 읽어야합니다.

관련 문제