2012-04-13 4 views
1

일반 텍스트를 보내면 문제가 없습니다. 모든 것은 괜찮습니다. 그러나 C# 클라이언트에서 이미지를 보내려고하면 서버가 올바른 바이트 수를 수신하지만 버퍼를 파일 (바이너리 모드 -wb)에 저장하면 항상 4 바이트가됩니다.C# 클라이언트에서 C 서버로 이미지 보내기

File.ReadAllBytes() 함수를 사용하여 C# 클라이언트에서 전송합니다.

FILE * pFile; 
    char *buf = ReceiveMessage(s); 
    pFile = fopen (fileName , "wb"); 
    fwrite(buf, sizeof(buf[0]), sizeof(buf)/sizeof(buf[0]), pFile); 
    fclose (pFile); 
    free(buf); 

내 수신 기능을 사용하면 sizeof(buf)를 사용하는 초보자의 실수를 할

static unsigned char *ReceiveMessage(int s) 
{ 
    int prefix; 
    recv(s, &prefix, 4, 0); 
    int len = prefix; 
    char *buffer= (char*)malloc(len + 1); 
    int received = 0, totalReceived = 0; 
    buffer[len] = '\0'; 
    while (totalReceived < len) 
    { 
     if (len - totalReceived > BUFFER_SIZE) 
     { 
     received = recv(s, buffer + totalReceived, BUFFER_SIZE, 0); 
     } 
     else 
     { 
     received = recv(s, buffer + totalReceived, len - totalReceived, 0); 
     } 
     totalReceived += received; 
    } 

    return buffer; 
} 

답변

1

C 코드는 ReceiveMessage() 함수에서 len을 다시 전달해야합니다.

char *buf = ReceiveMessage(s); // buf is a char* 
... sizeof(buff)    // sizeof(char*) is 4 or 8 

그래서 당신은 당신이 sizeof에 의해 배열의 크기를 얻을하지 않습니다

static unsigned char *ReceiveMessage(int s, int* lenOut) 
{ 
    ... 
    *lenOut = totalReceived ; 
} 
+0

대신 왜'strlen (buf)'를 사용할 수 없습니까? – deem

+1

왜냐하면'strlen()'은 문자열을 의미하기 때문에 첫 번째 '\ 0'까지만 계산됩니다 –

1

모양처럼

내 저장 코드 보인다. 버퍼의 바이트 수는 반환하지 않지만 포인터의 크기는 32 또는 64 비트 플랫폼을 실행하는 경우 4 개 또는 8 개입니다.

ReceiveMessage 함수를 변경하여 수신 된 데이터의 크기를 "반환"해야합니다.

+0

하는 이유는'나 strlen 사용할 수 없습니다 (버피)'대신? – deem

+1

@daroPL 수신 된 데이터가 실제로 적절한 문자열 일 때만 가능합니다. 그것이 이미지라면 문자열 터미네이터로 사용되는 값이 '0'인 바이트를 포함 할 수있는 바이너리 데이터를 포함합니다. –

1

뭔가를해야합니다. 변경 즉하기 :

int len = 0; 
char *buf; 

buf = ReceiveMessage(s, &len); 

/* then use len to calculate write length */ 


static unsigned char *ReceiveMessage(int s, int *len) 
/* or return len and pass ptr to buf */ 
{ 


    ... 
} 
관련 문제