我正在尝试编写代码,使用 C 中的 HTTP POST 将 JPEG 图像发送到服务器。在我的代码中,我试图构建 http post 请求( header 、边界、内容等...)。在这种情况下,内容是 JPEG 图像。图像在服务器端已损坏。我想知道我的代码有什么问题..
对于那些可能建议使用 curl 的人:我知道 curl 可以节省我很多工作,但我在一个 linux 机器上运行这段代码,不幸的是它不支持 curl..
更新:我稍微编辑了我的代码(代码已在下面更新),并比较了客户端和服务器端的两个文件,在服务器端我发现所有 00 都丢失了......有趣的事实但我仍然无法弄清楚为什么这样做
#define MAXLINE 38400
#define FILESIZE 37632
#define MAXSUB 38016
char boundary[40] = "---------------------------";
ssize_t process_http(int sockfd, char *host, char *page, char *boundary, char *poststr)
{
char sendline[MAXLINE + 1], recvline[MAXLINE + 1];
ssize_t n;
snprintf(sendline, MAXLINE,
"POST /%s HTTP/1.0\r\n"
"Host: %s\r\n"
"Content-type: multipart/form-data; boundary=%s\r\n"
"Content-length: %d\r\n\r\n"
"%s", page, host, boundary, strlen(poststr), poststr);
write(sockfd, sendline, strlen(sendline));
while ((n = read(sockfd, recvline, MAXLINE)) > 0) {
recvline[n] = '\0';
printf("%s", recvline);
}
return n;
}
在主要:
//...
//socket initialization
//...
if ((fp = fopen(filename, "rb")) == NULL){
printf("File could not be opened\n");
exit(1);
}
else{
while((ch = getc(fp)) != EOF){
sprintf( &fileline[strlen(fileline)], "%c", ch );
}
fclose(fp);
}
snprintf(poststr, MAXSUB,
"--%s\r\nContent-Disposition: form-data;"
"name=\"file\"; filename=\"%s\"\r\nContent-Type: text/plain\r\n\r\n"
"%s\r\n\r\n"
"--%s\r\n"
"Content-Disposition: form-data; name=\"boxkey\"\r\n\r\n%s\r\n"
"--%s--", boundary, filename, fileline, boundary, key, boundary);
//...
//then make socket connection...
//...
process_http(sockfd, hname, page, boundary, poststr);
//then close socket and return...
它已损坏,因为您尝试使用字符串函数将其添加到您发送的数据包中。您必须记住,C 字符串函数使用字符 '\0'
(在 ASCII 字母表中为零)用作字符串终止符。 snprintf
函数第一次在图像数据中找到零字节时,它认为“字符串”到此结束。
也可能是您读取二进制 文件,您首先以文本 模式打开该文件,这意味着可能存在换行符转换。您还用换行符替换零,这对于二进制数据也是不正确的。
我是一名优秀的程序员,十分优秀!