Http Server
实现代码
#define SERVERPORT 80
const char *DefaultPage=
"<html>"
"<head>"
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />"
"<title>欢迎进入html世界</title>"
"</head>"
"<body>"
"<P>这会是一个很有趣的实验</P>"
"</body>"
"</html>";
/*
"<html>"
"<head><title>Default</title></head>"
"<body>I am Http server!</body>"
"</html>"
;
*/
// 发送200 ok报头
int file_ok(int cfd, long flen)
{
char *send_buf = zalloc(sizeof(char)*100);
sprintf(send_buf, "HTTP/1.1 200 OK\r\n");
send(cfd, send_buf, strlen(send_buf), 0);
sprintf(send_buf, "Connection: keep-alive\r\n");
send(cfd, send_buf, strlen(send_buf), 0);
sprintf(send_buf, "Content-Length: %ld\r\n", flen);
send(cfd, send_buf, strlen(send_buf), 0);
sprintf(send_buf, "Content-Type: text/html\r\n");
send(cfd, send_buf, strlen(send_buf), 0);
sprintf(send_buf, "\r\n");
send(cfd, send_buf, strlen(send_buf), 0);
free(send_buf);
return 0;
}
void ATaskHttpServer(void *pvParameters)
{
int iVariableExample = 0;
int fd = -1;
int cfd = -1;
int NetTimerOut = 2000;
int ret;
struct sockaddr_in serverAddr;
struct sockaddr ClientAddr;
socklen_t ClientAddrlen = sizeof(struct sockaddr);
char *Httpmsg;
char *Sendmsg;
STATION_STATUS StaStatus;
//等待连接wifi
do
{
StaStatus = wifi_station_get_connect_status();
vTaskDelay(100);
} while (StaStatus != STATION_GOT_IP);
//建立socket
fd = socket(PF_INET, SOCK_STREAM, 0);
if (fd == -1)
{
printf("get socket fail!\n");
vTaskDelete(NULL);
return;
}
//设置socket超时时间
setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &NetTimerOut, sizeof(int));
//设置socket信息,ip,端口号
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(SERVERPORT);
serverAddr.sin_len = sizeof(serverAddr);
//绑定ip信息
if(bind(fd, (struct sockaddr *)&serverAddr, serverAddr.sin_len) != 0)
{
printf("bind socket fail!\n");
vTaskDelete(NULL);
return;
}
//最大连接数5
if(listen(fd, 5)!=0)
{
printf("listen socket fail!\n");
vTaskDelete(NULL);
return;
}
Httpmsg = (char *)zalloc(sizeof(char)*1000);
for (;;)
{
//等待客户端连接
cfd = accept(fd, &ClientAddr, &ClientAddrlen);
if(cfd != -1)
{
printf("HttpClient accept\n");
ret = recv(cfd, Httpmsg, 1000, 0);
if (ret > 0)
{
printf("HttpClient recv\n");
printf("%s\n",Httpmsg);
printf("%d\n",strlen(DefaultPage));
file_ok(cfd,strlen(DefaultPage));
send(cfd,DefaultPage,strlen(DefaultPage),0);
}
else
{
printf("HttpClient data is no!\n");
/* code */
}
}
//关闭连接
close(cfd);
}
free(Httpmsg);
vTaskDelete(NULL);
}
void HttpServer_int(void)
{
xTaskCreate(ATaskHttpServer, "HttpServer", 256, NULL, 4, NULL);
}
串口界面
浏览器测试