몇 가지 기본적인 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 전송 제어 논의하지 :
- http://blogs.msdn.com/b/joncole/archive/2006/03/20/simple-message-framing-sample-for-tcp-socket.aspx
우리는 ACK를받을 때까지 STX를 보내고 길이 + 페이로드 + MD5를 전송하고 다른 ACK를받을 때까지 기다린 다음 "보내기"를 완료 할 때까지이 메서드를 구현했습니다. 문제는 그것이 동기 프로세스에 있다는 것입니다. 이 작업이 완료되기까지 오래 걸리지는 않지만 ACK를 기다리는 동안 유사한 데이터를 수신해야 할 수도 있습니다.비동기로이 작업을 수행하는 가장 좋은 방법은 무엇입니까? –
Socket.BeginReceive()를 사용하십시오. –
비동기 소켓을 수행하는 방법을 알고 있습니다. 핸드 셰이크를 비동기 적으로 처리하는 최선의 방법이 아닙니다. 콜백을 받으면 수신 된 데이터를 기반으로 전송을 트리거해야합니까, 아니면이를 수행하는 더 좋은 방법이 있습니까? 예 : ACK가 수신되면 다음 항목을 전송 대기열에 보냅니다. STX가 수신되면 ACK를 보냅니다. 페이로드가 수신되면 ACK 등을 보냅니다. –