Linux网络编程(一)—-简单的服务器及数据读取显示

这次主要是实现服务器的基本连接和读取功能,使得能够使用浏览器访问服务器,并且服务器输出浏览器的请求信息(即Http请求报文),主要流程如下:

1.创建一个socket;

2.设置sockaddr_in中的地址和端口信息;

PS:如果是绑定本机任意一个ip地址,则sin_addr.s_addr设置为INADDR_ANY,如果是固定的一个ip,如127.0.0.1,则需要使用inet_addr(“127.0.0.1”)把字符串转换成网络字节序;

3.使用bind绑定socket;

4.使用listen监听文件描述符;

5.进入while循环,使用accept函数进行阻塞等待客户端连接;

6.如果连接成功,则使用read读取内容,并进行显示。

下图为使用浏览器访问时的截图,我们可以清晰地看到http报文请求信息:

QQ图片20160310134127实验代码如下:

#include<stdio.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
//简单的服务器实现
int main()
{
	printf("server is running...\n");
	int listenFd,connectFd;
	int res;
	listenFd = socket(AF_INET,SOCK_STREAM,0);//创建一个套接字

	//设置地址和监听端口
	sockaddr_in servAddr;//netinet/in.hi
	bzero(&servAddr,sizeof(servAddr));//string.h
	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.s_addr = INADDR_ANY;// inet_addr("127.0.0.1");//把字符串的ip转换成网络序
	servAddr.sin_port = htons(8800);//arpa/inet.h 把short型从主机序转换成网络序
	
	res = bind(listenFd,(sockaddr*)&servAddr,sizeof(servAddr));//需要把sockaddr_in强制转换成sockaddr
	if(res<0)
	{
		printf("bind error\n");
	}
	int backlog;
	listen(listenFd,backlog);

	printf("listening...\n");
	while(1)
	{
		printf("connecting...\n");

		sockaddr_in cliAddr;
		socklen_t addrLength = sizeof(sockaddr_in);
		connectFd = accept(listenFd,(sockaddr*)&cliAddr,&addrLength);
		printf("connect success!\n");
		//进行读取
		char buffer[1024];
		
		//读取循环
		while(1)
		{
			bzero(buffer,sizeof(buffer));
			int readSize=read(connectFd,buffer,1024);//unistd.h
			printf("%s",buffer);
			if(readSize==0)//读取完毕
				break;//跳出循环
		}
		//显示完毕后,关闭fd
		close(connectFd);//unistd.h
	}

	return 0;
}