2011-03-16 2 views
0

매우 간단한 웹 서버를 c (winsock2)로 작성하고 있습니다.c를 사용하여 winsock2에서 이미지를 보내는 방법

내 HTML 페이지의 내용을 반환 할 수 있습니다. 현재

, 제가 숯불 * 버퍼에 파일의 내용을 작성하고 사용하여 보내는 일을하고있다 "전송()"나는 이미지 (JPG, BMP)를 읽으려고 할 때 비록

, I 일부 문자가 "null"(0) 인 버퍼에 문자를 쓸 수 없습니다.

전체 이미지 파일을 보내려면 어떻게해야합니까?

감사합니다.

답변

1

당신은 char* 버퍼에 널 문자를 저장할 수 있습니다 참조하십시오. 널 (null)이 아닌 문자의 수를 계산하여 다시 계산하는 대신 버퍼에 다음 삽입 지점에 대한 포인터 또는 포인터가 될 수 있습니다.

당신이 그런 식으로 뭔가를 할 것이다, 파일을 보내려면 보내는 방법을 이해()와 FREAD() 일 필요가

int sendFile(int sock, const char* filename) { 
    FILE* file = fopen(filename, "rb"); 
    if (file == NULL) 
     return -1; 

    if (fseek(file, 0, SEEK_END) != 0) { 
     fclose(file); 
     return -1; 
    } 

    off_t size = ftello(file); 
    if (fseek(file, 0, SEEK_SET) != 0) { 
     fclose(file); 
     return -1; 
    } 

    if (SendBinaryFileHeaderAndSize(sock, size) < 0) { 
     fclose(file); 
     return -1; 
    } 

    char buffer[4096]; 
    for (;;) { 
     size_t read = fread(buffer, 1, sizeof(buffer), file); 
     if (read == 0) { 
      int retcode = 0; 
      if (ferror(file)) 
       retcode = -1; 
      fclose(file); 
      return retcode; 
     } 

     for (size_t sent = 0; sent < read;) { 
      int ret = send(sock, buffer + sent, read - sent, 0); 
      if (ret < 0) { 
       fclose(file); 
       return -1; 
      } 

      assert(ret <= read - sent); 
      sent += ret; 
     } 
    } 
} 
+0

C 이미지 파일의 크기를 어떻게 알 수 있습니까? 일단 내가 그 이미지에서 내용을 가져올 fgetc 사용할 수 있습니다 알아? 또한 나는 fseek에서 크기가 있다고 생각합니다. 그러나 브라우저에서 이미지를 열면 브라우저는 단지 빈 페이지 일뿐입니다. 그 안에 아무것도 없다. –

+1

'fseek (file, O, SEEK_END)'또는 특정 플랫폼 코드 ('lstat','GetFileInformationByHandle', ...)를 사용하여 파일의 크기를 알 수 있습니다. 또한 HTTP 프로토콜에 따라 올바른 헤더 (크기, 내용 유형, ...)를 클라이언트에 전송했는지 확인해야합니다 (바이너리 파일에 액세스하려고 할 때 다른 웹 서버를 사용하여 보낼 내용을 확인할 수 있음) . –

+0

파일을 읽을 수있는 것 같습니다. 내가 열 때. 파일을 다운로드 할 수 있지만 손상된 것 같습니다. fgetc가 서명 된 char을 반환합니까? 그리고 winsock.send는 unsigned chars를 전송할 수 있습니까? –

0

는 웹 서버로 이미지를로드하는 방법에 따라 Winsock:TransmitPackets 또는 Winsock:TransmitFile, 하나는 또한 이러한 MS 특정 확장 것을

참고 적절한 HTTP 헤더에 이미지를 배치 사용해야합니다.

또한 c++ - Bitmap transfer using winsock getdibits and setdibits

+0

TransmitPackets에 대한 몇 가지 예제 코드를 제공 할 수 있습니까? WindowsXP를 사용하고 있습니다. 나는 c에 너무 능숙하지 않다. –

+0

나는 모든 것을 http://msdn.microsoft.com/en-us/library/ms740632(v=VS.85).aspx –

+0

에서 읽을 것을 권하고 싶다. 파일 전송에 많은 부분을 찾을 수 없습니다. –

1

. 버퍼의 0은 send 나 fread에서 문제가되지 않습니다. 버퍼를 null로 끝나는 문자열로 해석하지 않습니다.

관련 문제