당신은 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;
}
}
}
C 이미지 파일의 크기를 어떻게 알 수 있습니까? 일단 내가 그 이미지에서 내용을 가져올 fgetc 사용할 수 있습니다 알아? 또한 나는 fseek에서 크기가 있다고 생각합니다. 그러나 브라우저에서 이미지를 열면 브라우저는 단지 빈 페이지 일뿐입니다. 그 안에 아무것도 없다. –
'fseek (file, O, SEEK_END)'또는 특정 플랫폼 코드 ('lstat','GetFileInformationByHandle', ...)를 사용하여 파일의 크기를 알 수 있습니다. 또한 HTTP 프로토콜에 따라 올바른 헤더 (크기, 내용 유형, ...)를 클라이언트에 전송했는지 확인해야합니다 (바이너리 파일에 액세스하려고 할 때 다른 웹 서버를 사용하여 보낼 내용을 확인할 수 있음) . –
파일을 읽을 수있는 것 같습니다. 내가 열 때. 파일을 다운로드 할 수 있지만 손상된 것 같습니다. fgetc가 서명 된 char을 반환합니까? 그리고 winsock.send는 unsigned chars를 전송할 수 있습니까? –