C 如何使用分块编码发送HTTP应答?

C 如何使用分块编码发送HTTP应答?,c,linux,http,sockets,chunked-encoding,C,Linux,Http,Sockets,Chunked Encoding,大家好,我正在尝试使用分块编码来传输多媒体数据。因此,我首先尝试使用分块编码发送文本数据 这是我的密码。我已经创建了一个服务器套接字,在这个套接字上我监听请求(端口80),回复请求,然后我的程序终止。无论你提出什么要求,你都会得到同样的答复。在我的机器上我发送“http://localhost/anirudh.html“作为来自浏览器的请求。输出显示数据包已发送,但在浏览器上未显示任何内容。我在某个地方犯了一个错误,因为我不知道如何正确地使用分块编码发送回复,所以我无法找出错误 #include

大家好,我正在尝试使用分块编码来传输多媒体数据。因此,我首先尝试使用分块编码发送文本数据

这是我的密码。我已经创建了一个服务器套接字,在这个套接字上我监听请求(端口80),回复请求,然后我的程序终止。无论你提出什么要求,你都会得到同样的答复。在我的机器上我发送“http://localhost/anirudh.html“作为来自浏览器的请求。输出显示数据包已发送,但在浏览器上未显示任何内容。我在某个地方犯了一个错误,因为我不知道如何正确地使用分块编码发送回复,所以我无法找出错误

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<fcntl.h>

int main(){

    struct sockaddr_in sockserv,sockclient;
    int socketfd,clientfd;
    socklen_t clientsocklen;
    int filefd;
    int finalcnt = 0;

    char buff[BUFSIZ];

    socketfd = socket(AF_INET,SOCK_STREAM,0);   
    printf("Socket Creation: %s\n",strerror(errno));

    bzero(&sockserv,sizeof(sockserv));

    sockserv.sin_family = AF_INET;
    sockserv.sin_addr.s_addr = INADDR_ANY;
    sockserv.sin_port = htons(80);

    bind(socketfd,(struct sockaddr *)&sockserv,sizeof(sockserv));
    printf("Socket Bind: %s\n",strerror(errno));

    listen(socketfd,10);
    printf("Socket Listen: %s\n",strerror(errno));

    clientfd = accept(socketfd,(struct sockaddr*)&sockclient,&clientsocklen);
    printf("request accepted\n");

    buff[read(clientfd,buff,BUFSIZ)] = '\0';
    printf("Request recieved as \n%s\n",buff);  

    sprintf(buff,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nDate: Mon, 28 Feb 2011 10:38:19 GMT\r\nTransfer-Encoding: chunked\r\nServer: Myserver\r\n\r\n%x\r\n%s\r\n0\r\n",strlen("<html><body><p> HI I am anirudh tomer </p> </body></html>"),"<html><body><p> HI I am anirudh tomer </p> </body></html>");

    printf("\n\nREPLY TO THE CLIENT\n\n%s\n\n",buff);

    finalcnt = send(clientfd,buff,strlen(buff),0);  
    printf("Sent %d bytes to the client : %s\n",finalcnt,strerror(errno));

    close(clientfd);
    close(socketfd);

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(){
sockserv中的结构sockaddr_,sockclient;
int socketfd,clientfd;
socklen_t clientsocklen;
int-filefd;
int finalcnt=0;
字符buff[BUFSIZ];
socketfd=socket(AF_INET,SOCK_STREAM,0);
printf(“套接字创建:%s\n”,strerror(errno));
bzero(&sockserv,sizeof(sockserv));
sockserv.sin_family=AF_INET;
sockserv.sin\u addr.s\u addr=INADDR\u ANY;
sockserv.sin_port=htons(80);
绑定(socketfd,(struct sockaddr*)&sockserv,sizeof(sockserv));
printf(“套接字绑定:%s\n”,strerror(errno));
听(socketfd,10);
printf(“套接字侦听:%s\n”,strerror(errno));
clientfd=accept(socketfd,(结构sockaddr*)&sockclient,&clientsocklen);
printf(“接受请求”);
buff[读取(clientfd,buff,BUFSIZ)]='\0';
printf(“作为\n%s\n接收的请求”,buff);
sprintf(buff,“HTTP/1.1 200 OK\r\n内容类型:text/html\r\n日期:周一,2011年2月28日10:38:19 GMT\r\n转换编码:分块\r\n服务器:Myserver\r\n\r\n%x\r\n%s\r\n0\r\n”,斯特伦(“你好,我是anirudh tomer

”,“你好,我是anirudh tomer

”; printf(“\n\n复制到客户端\n\n%s\n\n”,buff); finalcnt=send(clientfd,buff,strlen(buff),0); printf(“已向客户端发送%d个字节:%s\n”,finalcnt,strerror(errno)); 关闭(clientfd); 关闭(socketfd); 返回0; }
答复如下:

anirudh@anirudh-Aspire-5920:~/Desktop/testing$ gcc test.c
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ sudo ./a.out
Socket Creation: Success
Socket Bind: Success
Socket Listen: Success
request accepted
Request recieved as 
GET /avashjfvjhaasadjfasafa.ogg HTTP/1.1
Host: localhost
Connection: keep-alive
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.98 Safari/534.13
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3




REPLY TO THE CLIENT

HTTP/1.1 200 OK
Content-Type: text/html
Date: Mon, 28 Feb 2011 10:38:19 GMT
Transfer-Encoding: chunked
Server: Myserver

39
<html><body><p> HI I am anirudh tomer </p> </body></html>
0


Sent 193 bytes to the client : Success
anirudh@anirudh-Aspire-5920:~/Desktop/testing$
anirudh@anirudh-Aspire-5920:~/Desktop/testing$gcc test.c
anirudh@anirudh-Aspire-5920:~/Desktop/testing$sudo./a.out
套接字创建:成功
套接字绑定:成功
听我说:成功
接受请求
收到的请求为
GET/avashjfvjhaaasdjfasafa.ogg HTTP/1.1
主机:本地主机
连接:保持活力
接受:application/xml、application/xhtml+xml、text/html;q=0.9,文本/普通;q=0.8,图像/png,*/*;q=0.5
用户代理:Mozilla/5.0(X11;U;Linux i686;en-US)AppleWebKit/534.13(KHTML,类似Gecko)Chrome/9.0.597.98 Safari/534.13
接受编码:gzip、deflate、sdch
接受语言:en-US,en;q=0.8
接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.3
回复客户
HTTP/1.1200ok
内容类型:text/html
日期:2011年2月28日星期一10:38:19 GMT
传输编码:分块
服务器:Myserver
39
嗨,我是阿尼鲁德·托默
0
已向客户端发送193字节:成功
anirudh@anirudh-Aspire-5920:~/桌面/测试$

请帮帮我。提前感谢。

您的回答似乎缺少最终的CRLF序列。在响应中添加一个附加的
\r\n
应该可以更正此错误。

感谢您指出此错误。如果你感兴趣,也可以看看这个