分类: 嵌入式
2010-08-10 11:11:13
完成一个webserver的实验。
原理:
1 socket编程
2 http语言编程
3 tcp协议
步骤:
1 在主机端编程,交叉编译,调试。
2 在开发板运行服务器webserver
3 在主机端打开浏览器,输入 (开发板的IP地址)
从上面看出开发板上的服务器打开以后,在主机端浏览器下可以访问此IP地址对应的网页
源代码来自周立功:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PORT 81
#define BACKLOG 10
#define LENGTH 1024
char httpweb[]={
"HTTP/1.0 200 OK\r\n"
"Date: Mon,24 Nov 2005 10:26:00 GMT\r\n"
"Server: microHttp/1.0 ZHIYUAN Electronics CO.,LTD\r\n"
"Accept-Ranges:bytes\r\n"
"Connection:Keep-Close\r\n"
"Content-Type:text/html\r\n"
"\r\n"
};
char web[]={
"\r\n"
"\r\n"
"
""
"
"HELLO WELCOME TO MagicARM2410 WEBSERVER
\r\n"
"\r\n"
"
"
\r\n"
"\r\n"
};
char httpgif[]={
"HTTP/1.0 200 OK\r\n"
"Date: Mon,24 Nov 2005 10:26:00 GMT\r\n"
"Server: microHttp/1.0 ZHIYUAN Electronics CO.,LTD\r\n"
"Accept-Ranges:bytes\r\n"
"Connection:Keep-Close\r\n"
"Content-Type:text/html\r\n"
"\r\n"
};
int main()
{
int sockfd;
int nsockfd;
int num;
// int flag = 1;
int sin_size;
char revbuf[LENGTH];
struct sockaddr_in addr_local;
struct sockaddr_in addr_remote;
if((sockfd = socket(AF_INET, SOCK_STREAM, 0))== -1){
printf("ERROR: Cannot obtain Socket Desperitor.\n");
return (0);
}else{
printf("OK:Obtain Socket Desperitor Successfully.\n");
}
addr_local.sin_family = AF_INET;
addr_local.sin_port = htons(PORT);
addr_local.sin_addr.s_addr = INADDR_ANY;
bzero(&(addr_local.sin_zero), 8);
if(bind(sockfd, (struct sockaddr*)&addr_local, sizeof(struct sockaddr)) == -1){
printf("ERROR: Cannot bind Port %d\n", PORT);
return (0);
} else{
printf("OK: Bind the Port %d successfuly.\n", PORT);
}
if(listen(sockfd, BACKLOG) == -1){
printf("ERROR: Cannot listen Port %d\n", PORT);
return (0);
}else{
printf("OK: Listening the Port %d successfuly.\n", PORT);
}
while(1){
sin_size = sizeof(struct sockaddr_in);
if((nsockfd = accept(sockfd, (struct sockaddr*)&addr_remote, &sin_size))== -1){
printf("ERROR: Obtain new Socket Despcritor error.\n");
continue;//跳过本次循环
}else{
printf("OK: Server had got connect from %s\n", inet_ntoa(addr_remote.sin_addr));
}
num = recv(nsockfd, revbuf, LENGTH, 0);
if(!fork()){
printf("OK: Http web is servering.\n");
if(revbuf[5] == ' '){
send(nsockfd, httpweb, sizeof(httpweb), 0);
send(nsockfd, web, sizeof(web), 0);
}
else if(revbuf[5] == '1'){
send(nsockfd, httpgif, sizeof(httpgif), 0);
}
}
close(nsockfd);
while(waitpid(-1, NULL, WNOHANG) > 0);
}
}