2010-06-22 2 views

답변

1

내가 과거에 VB6의 Winsock을 컨트롤을 사용했다 (내가 추측하고있어 Winsock_Close 이벤트가 발생이 때이다), 모든 데이터가 도착했을 때 형식 무엇인지 내가 한 어떤 방법으로 나의 메시지는 알고 .

예 : 각 메시지는 "["로 시작하고 "]"로 끝납니다.

"[메시지 텍스트]"

데이터가 메시지 "]"말에 대한 DataArrival 이벤트 확인에서 오는

. 거기에 있다면 적어도 하나의 전체 메시지와 아마도 새로운 메시지의 시작을 받았습니다. 더 많은 메시지가 대기 중이면 메시지 데이터를 폼 수준 변수에 저장하고 다음에 DataArrival 이벤트가 발생하면 추가합니다.

0

아니요, 모든 데이터가 도착하면 Close 이벤트가 발생하지 않으며 연결을 닫을 때 발생합니다. 모든 데이터가 전송 된 시점을 알아내는 것은 Winsock 컨트롤의 작업이 아닙니다. 클라이언트/서버 통신 프로토콜 구현의 일부로 클라이언트에게 예상 할 것을 알려줘야합니다.

클라이언트가 서버의 파일 내용을 원한다고 가정하십시오. 클라이언트는 파일에있는 데이터의 양을 모릅니다. 교환은 다음과 같이 갈 수 있습니다

  • 클라이언트가 파일
  • 서버가 파일을 읽고 크기를 결정, 데이터의 시작 크기를 첨부의 데이터에 대한 요청을 보냅니다 (의 그것을 사용하는 가정 해 봅시다 4 바이트) 클라이언트에게 예상 데이터 양을 알려주고 메시지를 보내기 시작합니다.
  • 클라이언트 코드는 파일 요청 후 도착한 모든 데이터에서 처음 4 바이트를 제거하고 그 다음 금액을 가질 때까지 임의의 수의 DataArrival 이벤트를 통해 후속 데이터를 누적하십시오.

이상적으로 서버는 데이터에도 체크섬을 추가하므로 예상되는 데이터 양을 얻지 못하면 어떻게해야하는지 파악하고 어떤 종류의 시간 제한 메커니즘을 구현해야합니다.

1

HTTP에서는 서버가 모두를 읽는 방법을 알기 위해 서버가 보내는 답장 데이터를 구문 분석하고 분석해야합니다.

먼저 서버는 CRLF로 구분 된 헤더 행 목록을 되돌려 보냅니다.이 목록은 빈 CRLF로 구분 된 행으로 종료됩니다. 나머지 데이터를 읽는 방법을 알고 싶다면 'Content-Length'및 'Transfer-Encoding'헤더의 실제 값을 조사해야합니다.

'Transfer-Encoding'헤더가 없거나 '청크 분할'항목이없는 경우 'Content-Length'헤더는 읽을 나머지 바이트 수를 지정합니다. 그러나 '전송 인코딩'헤더에 '청크'항목이 포함 된 경우 데이터가 끝나는 시점을 알기 위해 한 번에 하나씩 청크에있는 나머지 데이터를 읽고 구문 분석해야합니다 (각 청크는 자체 크기를보고합니다. 마지막 덩어리는 0의 크기를보고합니다.

아니요. '연결'헤더에 명시 적으로 '닫기'가 표시되어 있지 않으면 응답을 보내고 나면 연결을 닫을 수 없습니다. HTTP 1.1의 경우, 그 헤더는 대개 'keep-alive'로 설정됩니다. 즉, 소켓이 열린 채로있어 클라이언트가 동일한 소켓에서 더 많은 요청을 보낼 수 있습니다.

자세한 내용은 RFC 2616을 참조하십시오.

관련 문제