2017-11-16 8 views
0

TCP를 통해 클라이언트와 서버간에 통신을 시도하고 있습니다.비트 스트림 데이터 인쇄/TCP 관련

클라이언트가 비트 스트림으로 10 개의 16 진수를 Sever에게 보냈다고 가정 해 봅시다. send(socketID, pSend, 20, 0);pSend = &ArrayClient;unsigned short ArrayClient[] = { 0A, 0B, BA, B1...., FA }입니다.

서버는 recv(acceptID, pRecv, 20, 0)으로 바이트 스트림을 수신합니다. 내 포인터 pRecv의 내용을 올바르게 인쇄하려면 어떻게해야합니까? Sever는 클라이언트가 보낸 바이트 수를 알 수 없으므로 인쇄 할 수있는 바이트 수를 알지 못합니다. 데이터가 비트 스트림으로 전송 되었기 때문에 문자열이 아닙니다. 문자열로 작업하는 것 같이 \0을 찾음으로써 메시지의 끝을 알 수 없습니다.

따라서 얼마나 많은 바이트를 서버로 수신했는지, 또는 pRecv의 16 진수로 비트 스트림을 인쇄하는 방법을 알 수 있습니다.

이 같은 포인터와 비슷한 포인터를 시도 :

while(((unsigned int*)pRecv)[i] != 0){ 
    printf("%X", ((unsigned int*)pRecv)[i]); 
    i++; 
} 
+1

RECV() 함수의 값을 반환한다. (수신 한 바이트 수 또는 -1) ANY * 전송할 수있는 바이트 수를 알 수 없습니다. 당신은 단지 당신이 얼마나 많이 받았는지 알 수 있습니다. 클라이언트와 서버가 일종의 프로토콜이나 규칙을 사용하면 예상되는 바이트 수만 알 수 있습니다. (고정 길이를 전송하거나 먼저 길이를 전송하거나 매 * 메시지 * 다음에 구분 기호를 보내는 것과 같이) – joop

답변

2

TCP 처리하므로 프로토콜에 메시지 경계를 구분해야하는 메시지를 분리에는 내장 방법이 없습니다 어떤 알려진 방법.

이렇게하는 간단한 방법은 먼저 메시지의 길이를 나타내는 단일 바이트를 보낸 다음 해당 바이트 수를 보내는 것입니다.

예를 들어, 상기 메시지를 전송하기 전에, 다음을 수행

char mlen = 20; 
send(socketID, &mlen, 1, 0); 
+0

은 길이 또는 페이로드에 대한 바이트 순서 문제를 알게됩니다. 나는 바이너리가 아닌 텍스트를 보낼 것이다. 고정 크기 ASCII 길이, json 페이로드 – pm100

+0

예. 나는 이것을 알고있다. 나의 운동은 2 부분을 가지고있다. 나는 1 부에서 "원시적이고 순진한"데이터를 보내야 만한다. 들어오는 메시지의 길이를 처리하지 않고 보내는 것을 의미합니다. 경계를 세우고 모든 메시지를 서로 부숴 버리는 것은 제 2 부입니다. 그리고 나는 메시지를 텍스트로 보내고 싶습니다. 그것을 허용하지 않습니다. – Someonewhohaveacat