간단한 http 서버를 만들고 있습니다. 지금까지 소켓은 html 파일을 위해 작동합니다. 이제 작업 이미지를 만들려고합니다. 그런 다음c 소켓을 통해 이미지 보내기
char * fbuffer = 0;
long length;
FILE *f;
if ((f = fopen(file, "r")) == NULL)
{
perror("Error opening file");
exit(1);
}
fseek (f, 0, SEEK_END);
length = ftell(f);
fseek (f, 0, SEEK_SET);
fbuffer = malloc(length);
int total = 0;
if (fbuffer)
{
while (total != length)
{
total += fread(fbuffer, 1, length, f);
}
}
fclose (f);
난 그냥 소켓에 데이터를 전송 :
char response[20048];
snprintf(response, sizeof(response), "HTTP/1.1 200 OK\nContent-Type: %s\nContent-Length: %i\n\n%s", type, (int) strlen(fbuffer), fbuffer);
n = send(newsockfd, response, strlen(response)+1, 0);
가 왜 이미지 작동하지 않습니다
이 내가 파일을 읽을 어떻게? 브라우저에서 오류 The image “http://127.0.0.1:1050/image.gif” cannot be displayed because it contains errors.
HTTP 응답을 보여주는 것은 :
Content-Length: 7
Content-Type: image/gif
이미지가 247 바이트를 갖는다. 변수 길이와 합계는 247입니다. 변수 fbuffer는 GIF89a (+ 1 char -> 0 0 1 0 값을 가진 일부 2 진 사각형)를 포함합니다.
내가 뭘 잘못하고 있니?
감사합니다.
저 memcpy가 어떻게 작동하는지 설명해 주시겠습니까? HTTP 헤더를 int로 저장하면 어떻게 복사 할 수 있습니까? – dontHaveName
@dontHaveName'memcpy' 함수는 지정된 바이트 수를 한 버퍼에서 다른 버퍼로 복사합니다. 버퍼에있는 내용은 중요하지 않습니다. 이 경우 우리는'snprintf'를 사용하여 텍스트 인 헤더를 만듭니다. 이 함수는 기록 된 바이트 수를 반환했습니다. 그런 다음이 값을 사용하여'memcpy'에게 버퍼에 많은 바이트 즉, 헤더 뒤에있는 바이너리 데이터를 써야한다고 알려줍니다. – dbush
나는 다시 같은 문제가있다. 이번에 나는 stidin에서 2 개의 char 변수를 가지고있다. 나는 이처럼 읽는다. while ((c = getchar())! = EOF) {a [index] = c; b [index] = c; 색인 ++)}'. 그런 다음'write (newsockfd, & a, strlen (b)) '를 사용하여 소켓에 직접 씁니다. 다시 GIF89a를 표시합니다. 왜? 나는'a' 변수에 strlen이나 printf 함수를 사용하지 않습니다. 고마워요. 원한다면 새로운 질문을 만들 수도 있습니다. – dontHaveName