我正在尝试用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;
struct sockaddr_in socket_struct;
/*Creates the socket*/
if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
fprintf(stderr, "%s: %s\n", getprogname(), strerror(errno));
exit(EXIT_FAILURE);
}/*Ends the socket creation*/
/*Populates the socket address structure*/
socket_struct.sin_family = AF_INET;
socket_struct.sin_addr.s_addr=INADDR_ANY;
socket_struct.sin_port =htons(port);
if (bind(sock_fd, (struct sockaddr*) &socket_struct, sizeof(socket_struct)) < 0)
{
fprintf(stderr, "%s: %s\n", getprogname(), strerror(errno));
exit(EXIT_FAILURE);
}//Ends the binding.
if (listen(sock_fd, 5) <0)
{
fprintf(stderr, "%s: %s\n", getprogname(), strerror(errno));
exit(EXIT_FAILURE);
}//Ends the listening function
if ( (client_fd = accept(sock_fd, NULL, NULL)) <0)
{
fprintf(stderr, "%s: %s\n", getprogname(), strerror(errno));
exit(EXIT_FAILURE);
}//Ends the accepting.
while ( (size = read(client_fd, msg, 1024)) > 0)
{
//size = recv(client_fd, msg, 1024, MSG_PEEK|MSG_WAITALL);
if ( (msg[size-4] == 13) && (msg[size-3] == 10)&&(msg[size-2] == 13) && (msg[size-1] == 10) )
{
char* buffer = (char *)malloc(sizeof("The msg was: ")+ sizeof(msg));
sprintf(buffer, "The msg was: %s", msg);
send(client_fd, buffer, sizeof("The msg was: ")+ sizeof(msg), MSG_OOB);
}
}//ends the while loop for receiving data
close(client_fd);
}
printf()
并查看它是否进入while
循环内的if()
条件。似乎在send()
处存在问题。 - Aniket Inge