2010-12-07 3 views
1

에 (무효 *)에서 제거 내가이 꽤 똑바로 앞으로 문제라고 생각하지만, 난 여전히 그것을 알아낼 수 없습니다.앞에 추가 및 C

내가 네트워크를 통해 스트림을 보내는 기능을 가지고있다. 당연히, 이것은 인자로 const를 무효 *를 취합니다

void network_send(const void* data, long data_length) 

내가 소켓을 통해 그것을 전송하기 전에 이것의 char *의 형태로 특정 헤더를 앞에 추가하려고 :

long sent_size = strlen(header)+data_length; 
    data_to_send = malloc(sent_size); 
    memcpy(data_to_send,header,strlen(header)); /*first copy the header*/ 
    memcpy((char*)data_to_send+strlen(header),data,dat_length); /*now copy the actual data*/ 

이 작품 데이터가 실제로 char * 인 한 괜찮습니다. 그러나 다른 데이터 유형으로 변경되면 작업이 중지됩니다. 수신시

는 그것을 처리하기 전에 데이터로부터 헤더를 제거해야한다. 그래서 이것은 그것을하는 방법입니다 :

void network_data_received(const void* data, long data_length) 
{ 
........ 
memmove(data_from_network,(char*)data_from_network + strlen(header),data_length); /*move the data to the beginning of the array*/ 
ProcessFurther(data_from_network ,data_length - strlen(header)) /*data_length - strlen(header) causes the function ProcessFurther to read only certain part of the array*/ 
} 

이것은 데이터가 char 유형이라면 다시 작동합니다. 다른 유형이라면 충돌이 발생합니다.

누구나 올바르게 구현할 수있는 방법을 제안 할 수 있습니까?

안부, 칸

+0

어떻게 이러한 함수를 호출합니까? 코드를 제공 할 수 있습니까? – detunized

+2

당신은'strlen'을 사용하여 data_length를 계산하지 않습니까? 정말 헤더에 맞는 기능입니까? – Rup

+0

문제는 (char *) data_to_send + strlen (header) –

답변

0

unsigned char *을 사용하면 문제가 해결됩니다. 귀하의 의견에 모두 감사드립니다.

0

memcpy의 동작은 정의되어 있지 않으면 당신이 memmove()char*이 무엇을하지 않을 때 정확히 무슨 일이 일어나고 무엇

를 사용한다 (이 경우에서와 같이) 소스 및 대상의 중복? 이 기능들은 실제로 어떤 작업을하기 전에 void*으로 캐스팅됩니다 ...

+0

이 char *이 아닐 때 저장합니다. 그러나받는 쪽에서 그것은 엉망이된다. 데이터가 암호화되기 때문에 (아주 간단한 XOR 암호화). 기본적으로 여기에는 두 가지 유형의 데이터가 있습니다. char * 부호 없음 * 그래서 void *를 양쪽 모두에서 작동하는 어떤 유형으로 변환해야한다고 생각합니다. 내 knowlefge C + +에서 그것을 사용하는 부족으로 인해 제한됩니다 –

2

정렬과 같은 사운드가 문제 일 수 있지만이를 수행하는 플랫폼을 지정하지 않았습니다 (다른 CPU 아키텍처는 서로 다른 정렬 요구 사항을가집니다) .

헤더의 길이는 다음과 같은 데이터의 정렬을위한 "잘못"이면

, 즉 액세스 위반이 발생할 수 있습니다.

+0

정렬 문제가 사실 infact 때문에 때로는 데이터가 서명되지 않은 * 형식의 잘못된 메모리 액세스가 가져옵니다. –

2

이 코드에서 뭔가 놀랍습니다. 헤더가 실제로 문자열입니까? 유사한 구조체 인 경우 strlen을 sizeof로 바꿔야합니다. 0이 아닌 종료 문자열에 strlen을 호출하면 충돌이 발생할 수 있습니다.

나 수신 된 데이터를 읽을 때, 당신이 어딘가에 헤더를 복사해야한다는 것입니다 놀라게 두 번째 것. 그것을 사용하지 않는 경우, 왜 그것을 전선으로 보내야합니까?

EDIT : 정상적으로 헤더는 http 문자열과 비슷합니다. 거기에서 아무런 문제가 없어야하며, 테스트하는 경우 실제로 분석 할 필요가 없습니다.

그리고 실제로 필요한 위치로 데이터를 이동해야합니다. 버퍼의 시작 부분으로 이동하는 것이 올바른 일이 아닌 것처럼 보입니다.

정렬에서 문제가 발생하면 데이터를 사용하기 전에 바이트 단위로 실제 대상 유형의 변수에 데이터를 복사하면 사라집니다.

는 다른 해결책이있다 : malloc을 사용하여 버퍼를 할당하고 처음에 원하는 데이터 구조를 넣어. 그렇다면 그것을 캐스팅 할 수 있어야합니다. malloc에 ​​의해 반환되는 주소는 모든 유형과 호환됩니다.

C++로 작업하는 경우, 비범 한 클래스로 캐스팅하는 것이 효과가 없을 수도 있습니다 (vtable에 잘못된 주소가 포함될 가능성이 있고 다른 문제가있는 경우).

또 다른 가능한 문제는 data_length를 얻는 방법입니다. 바이트 수 여야합니다. 아이템 수가 많지 않습니까? 우리가 호출 코드에 대한 힌트가 필요하다는 것을 확실하게하기 위해서.

+0

헤더는 다음과 같습니다. static const char * header = "GET /images/logo.gif \ r \ n HTTP/1.1. \ r \ n 수락 : /. \ r \ n 리퍼러 : google.com. \ r \ n Accept-Language : en-us. \ r \ n 데이터 : " –

0

data_length이 호출 코드에서 올바르게 계산되지 않았을 수 있습니다. 그렇지 않으면이 코드는 @unwind가 언급 한 가능한 정렬 문제와 별개로 보인다.

header은 어떻게 선언됩니까? 길이가 가변적입니까? header 다음에 종료되는 NUL 문자가 누락 되었습니까?

+0

헤더가 다음과 같이 선언되었습니다. 정적 const char * header ="GET /images/logo.gif \ r \ n HTTP/1.1. \ r \ n 수락 : */*. \ r \ n 리퍼러 : http://www.google.com/. \ r \ n 수락 언어 : en-us. \ r \ n 데이터 : "; 길이는 122입니다. infact 헤더가 문제가 아니므로 (char *) 로의 변환이 문제의 원인입니다. –

0

송신자와 수신자가 동일한 바이트 순서 구조 (리틀 엔디안 대 빅 엔디안)를 사용하는지 확인합니다.

관련 문제