2012-02-23 1 views
0

을 사용할 수 없습니다를 통해 수신 ... 그렇지 않습니다 작업. 배열의 사용하지 않는 부분을 채우고 임의의 문자의 무리와 함께 내가 디버그 실행하면데이터 소켓 그래서 수신 버퍼에서 추출하려고 그러나 때 ... 나는 소켓 통신을 받고 있어요, 내가 적절한 메시지를 받고 있어요 C++

void CClientSocket::OnReceive(int nErrorCode) 
{ 
    char buff[1000]; 
    int ibuf = Receive(buff,sizeof(buff)); 
    buff[sizeof(buff)-1] ='\0'; 
    CSocket::OnReceive(nErrorCode); 
} 

는, 버프의 값이 적절한 메시지를 포함 ... : 내 코드는 다음과 같이 보입니다. 그러나, 나는 그 데이터를 사용할 수 없다 ... CString으로 변환하려고하거나 문자를 다른 배열로 전송하려고하면 ... 아무 것도 작동하지 않는다. 나는 당황스럽고 무엇을해야할지 정말로 모른다.

당신이 더 많은 정보가 필요하면 알려주세요 아니면 어떤 식 으로든 불분명 생각합니다.

편집 : 나는 데이터를 추출하는 것을 시도했다 몇 가지 코드

CString string; 
string = CString(buff); 

char *msg; 
msg = new char[ibuf] 
for(int i = 0; i < ibuf; i++){ 
    msg[i] = (char)buff[i]; 
} 

편집 : 나는 때 의미 '아무것도 작동하지 않습니다'고 말했다 몇 가지 설명 나는 그것을 변환하려고, 결과 및 빈 CString 또는 빈 숯 등 ... 거기에 오류가 있습니다.

+0

당신이 아무튼 관련 코드를 게시 할 수 (당신이 HTTP를하고 있다면 헤더를 처리하는 동안 당신이 그 응답의 내용에 대한 특정 버퍼 크기를 결정, 개행 문자가 표시 될 때까지 예를 들어, 당신은 ... 문자 버퍼 수) 일하지 않니? 즉 : "CString"으로 변환하려고 할 때? – netcoder

+0

이것이 아마도'std :: string'을 발명 한 이유입니다 : D – Griwes

+1

우리는 프로그래머가 오류 메시지를 이해할 수 있습니다. "아무것도 작동하지 않는다"고 말하지 마십시오. 분명히 코드를 올바르게 작성하면 분명히 무언가가 작동합니다. –

답변

4
int ibuf = Receive(buff,sizeof(buff)); 
buff[sizeof(buff)-1] ='\0'; 

오히려 그 두번째 행보다 buff[ibuf]의 제로 바이트 넣어. 그러나 그 전에, 에러 체크를 추가 (확인 ibuf > 0 있는지 그렇지 않은 경우, 연결 드롭으로 처리합니다.) 또한, 당신은 이런 식으로 할 경우 Receive(buff, sizeof(buff)-1);합니다 (-1주의해야한다 - 이것이 종료 문자를 차지하고 - 감사 @Altnitak 이 밖을 가리키는입니다.)

를 다른 한편을 위해 ... 나는이 소켓 코드를 치료하는 방법은 없다는 것을 주장 할 것이다. 문자열은 네트워크를 통해 원자 적으로 전송되지 않습니다. 그들은 쪼개 질 것이다. 프로토콜을 제어하는 ​​경우 유니버 스의 문자열 중심보기를 벗어나 메시지가 정수 (uint16_t 또는 uint32_t)로 시작하도록 네트워크 통신을 구성하고 길이가/htonl 등이되도록해야합니다. 다음 페이로드의 그런 다음 들어오는 바이트를 버퍼링하고 지정된 길이를 만족시킬만큼 충분한 바이트가있을 때 처리하십시오.

당신이 프로토콜을 제어하지 않는 경우, 콘텐츠를 처리 할시기를 결정하고, 당신이 그것을 도달 할 때까지 바이트를 버퍼링하는 데 사용할 수있는 편리한 마커를 찾을 수 있습니다.

+0

으로 들여다보아야한다. 1. 'ibuf == sizeof (buff)'2를 설명 할 필요가있다.원자 전송, 등? TCP 소켓 인 경우 관련성이 없습니다. – Alnitak

+0

@Alnitak - 아니 그것과 관련이 없습니다. 당신은'write (fd, foo, len)'을 할 수없고, 다른 쪽이'read'에서 정확히'len'을 리턴한다고 가정합니다. 그들은 다음 호출에서'read'와'len -n' 호출 중 첫 번째'n' 바이트를 얻을 수 있습니다. – asveikau

+0

맞아요, 그가'len'을 요구하지 않는다는 것을 제외하고 당신이 의미하는 것을 보았습니다, 그는'sizeof (buff) '즉 1000 바이트를 요구하고 있습니다. TCP라면 시스템은 그보다 작게 글을 쓰더라도 잘 읽으려고 시도합니다. 즉 시스템은 패킷 경계에 의해 제약받지 않고 스트림에서 필요한 양의 데이터를 반환합니다. – Alnitak

관련 문제