用C编写Web服务器

用C编写Web服务器,c,http,webserver,C,Http,Webserver,我正在尝试用C编写一个简单的Web服务器。到目前为止,我可以接收连接和完整的消息。但是,根据HTTP/1.0协议,我希望在遇到“\r\n\r\n”序列时能够将信息发送回客户端。但是,当使用Telnet测试我的服务器时,当我输入“\r\n\r\n”时,服务器不会执行任何操作,直到我在客户端上点击“^]”。我对Apache进行了测试,Apache没有这个问题。所以我希望得到一些关于如何模仿Apache行为的信息。我的代码添加在下面,但请记住,我没有接近完成,也没有实现很多错误检查。 谢谢 main(

我正在尝试用C编写一个简单的Web服务器。到目前为止,我可以接收连接和完整的消息。但是,根据HTTP/1.0协议,我希望在遇到“\r\n\r\n”序列时能够将信息发送回客户端。但是,当使用Telnet测试我的服务器时,当我输入“\r\n\r\n”时,服务器不会执行任何操作,直到我在客户端上点击“^]”。我对Apache进行了测试,Apache没有这个问题。所以我希望得到一些关于如何模仿Apache行为的信息。我的代码添加在下面,但请记住,我没有接近完成,也没有实现很多错误检查。 谢谢

main(){
int sock_fd=0;
int client_fd=0;
套接字结构中的结构sockaddr\u;
/*创建套接字*/
if((sock\u fd=socket(AF\u INET,sock\u STREAM,0))<0)
{
fprintf(stderr,“%s:%s\n”、getprogname()、strerror(errno));
退出(退出失败);
}/*结束套接字创建*/
/*填充套接字地址结构*/
socket\u struct.sin\u family=AF\u INET;
套接字结构sin\u addr.s\u addr=INADDR\u ANY;
socket_struct.sin_port=htons(端口);
if(bind(sock_fd,(struct sockaddr*)和socket_struct,sizeof(socket_struct))<0)
{
fprintf(stderr,“%s:%s\n”、getprogname()、strerror(errno));
退出(退出失败);
}//结束装订。

如果(listen(sock_fd,5)首先,这一行行不通:

while ( (size = read(client_fd, msg, 1024)) > 0)
这将接收消息块,您收到的每个消息块都将覆盖最后一个消息块。请执行以下操作:

char msg[1024];
size_t pos = 0;
while (1) {
    assert(pos < sizeof(msg));
    ssize_t amt = read(client_fd, msg + pos, sizeof(msg) - pos);
    if (amt < 0)
        err(1, "read failed");
    if (amt == 0)
        break; // EOF
    pos += amt;
    char *e = strstr(msg, "\r\n\r\n");
    if (e) {
        size_t msglen = e - msg;
        /* Handle a complete message here */
    }
}
带外数据是TCP的一个古怪特性,在现代协议中几乎肯定应该避免这种特性。它的实现因平台而异,只发送一个字节的带外数据是安全的


Telnet协议(扩展为Telnet上构建的FTP)将它用于某些事情,但在HTTP中没有任何用途。

尝试执行
printf()
并查看它是否在
while
循环中进入
if()
条件。似乎有问题@code>send()
send没有问题,因为我在发布之前已经完成了printf()操作…感谢您的帮助!我将其改为与recv一起使用,而不是read,但您肯定让我走上了正确的轨道,因此非常感谢您的帮助that@tpar44:对于插座,
recv
read
是相同的(flags参数除外)因此可以随意使用其中任何一个。
char msg[1024];
size_t pos = 0;
while (1) {
    assert(pos < sizeof(msg));
    ssize_t amt = read(client_fd, msg + pos, sizeof(msg) - pos);
    if (amt < 0)
        err(1, "read failed");
    if (amt == 0)
        break; // EOF
    pos += amt;
    char *e = strstr(msg, "\r\n\r\n");
    if (e) {
        size_t msglen = e - msg;
        /* Handle a complete message here */
    }
}
send(client_fd, buffer, sizeof("The msg was: ")+ sizeof(msg), MSG_OOB);