linux下简单的Socket+Http服务

C语言体验Socket Http服务

代码部分

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端口。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值