代码部分
socket监听80端口,接收到访问数据,返回简单的Http页面
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
int main(int argc, char *argv[])
{
int socket_id;
int ret;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int client_lenght;
int client_id;
char buffer[1024];
memset(&server_addr,0,sizeof(struct sockaddr_in));
server_addr.sin_port = htons(80);
server_addr.sin_addr.s_addr = inet_addr("192.168.0.1");
server_addr.sin_family = AF_INET;
socket_id = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(socket_id < 0)
{
printf("socket init error\n");
return 0;
}
ret = bind(socket_id,(struct sockaddr*)&server_addr,sizeof(server_addr)) ;
if(ret < 0)
{
printf("socket bind error:%s(errno %d)\n",strerror(errno));
return 0;
}
ret = listen(socket_id,20);
if(ret < 0)
{
printf("socket listen error\n");
close(socket_id);
return -1;
}
const char buf[]="HTTP/1.1 200 OK\r\nDate: Fri, 22 May 2009 06:07:21 GMT\r\nContent-Type: text/html; charset=UTF-8\r\n\r\n<html><head></head><body><p>恭喜你访问成功</p></body></html>";
printf("%s",buf);
printf("\n");
client_lenght = sizeof(client_addr);
printf("ready to get socket message !!!\n");
client_id = accept(socket_id,(struct sockaddr*)&client_addr,&client_lenght);
while(1)
{
memset(buffer,0,sizeof(buffer));
ret = recv(client_id,buffer,sizeof(buffer),0);
if( ret < 0)
{
printf("socket reciver error");
break;
}
printf("Receiver message:\n%s\n",buffer);
usleep(100);
send(client_id,buf,sizeof(buf),0);
}
close(socket_id);
return 0;
}
实验结果
使用浏览器输入地址192.168.0.1,可以拿到socket 80端口返回的http页面。
服务端显示结果
实验总结
1.一直好奇nginx之类的web服务器在程序中扮演的是什么角色,通过这个实验可以很好的理解。
nginx最基本的功能可以理解为监听80端口的一个程序,它基本的功能就是解析80端口中获取的socket裸数据,并用http协议解析,解析结束后提交到应用,如配置了fastcgi,即将数据传送至对应的cgi端口。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)