如果不用服务器软件搭建服务器?

Red_Up 2014-11-06 09:34:59
Web server的实现主要包括三个部分:建立服务器的进(线)程结构,通过socket实现网络通信,实现HTTP协议和数据库的应用。
Web server的具体要求如下:
1.开发运行平台工具:linux,C/C++
2.Web server 的进(线)程结构设计:采用面向连接的并发服务器(后台daemon进程),可选择如下实现方法如:
*针对每一请求建立一子进程为之服务;
*针对每一请求建立一线程为之服务;
*预先建立进程池,针对每一请求启动一子进程为之服务;
*预先建立线程池,针对每一请求启动一线程为之服务;
*其它方法。
3.网络编程
使用socket实现服务器端与browser的通信。
4.HTTP协议服务器端实现
GET方法和POST方法(响应部分)。
5.数据库应用
为数据库应用程序建立中间件,通过中间件和环境设置实现web server与数据库的查询 。


But How ?大学计算机本科一个课程设计,要我们自己搭建能被商业浏览器访问的浏览器。
不能用apache这些现成的服务器软件。
求指点迷津。
...全文
460 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Red_Up 2014-11-08
  • 打赏
  • 举报
回复
引用 14 楼 zilaishuichina 的回复:
[quote=引用 13 楼 Red_Up 的回复:] [quote=引用 10 楼 zilaishuichina 的回复:] [quote=引用 9 楼 Red_Up 的回复:] [quote=引用 8 楼 zilaishuichina 的回复:] 以上代码是windows下的 linux的同理
我是win7,64位也一样用吗? 用VC6.0可以吗?这样直接运行程序? 然后再登浏览器看?[/quote] 肯定可以啊 试试不就知道了嘛[/quote] 你好,我这样是可以的,那我之后可以怎么实现在另外一台计算机上通信?[/quote] 比如这个exe在10.1.1.123这台机器上 浏览器在10.1.1.45这台机器上 (注意这两台不同的机器得是同一个网段的机器,也就是局域网内的访问, 跨网段的访问需要路由器支持,原因以及路由器的配置方法可以google “NAT”) 你在10.1.1.45上 访问 http://10.1.1.123:12345 就可以了看到网页了 (跨网段的访问则需要访问10.1.1.123:12345经过路由NAT转换之后的外网地址)[/quote] 理解了,然后可以吧Hello web那一段改成相应的html文件也可以吧? 要是实现非局域网通信呢?不好意思,问题有点多。
zilaishuichina 2014-11-08
  • 打赏
  • 举报
回复
引用 15 楼 Red_Up 的回复:
[quote=引用 14 楼 zilaishuichina 的回复:] [quote=引用 13 楼 Red_Up 的回复:] [quote=引用 10 楼 zilaishuichina 的回复:] [quote=引用 9 楼 Red_Up 的回复:] [quote=引用 8 楼 zilaishuichina 的回复:] 以上代码是windows下的 linux的同理
我是win7,64位也一样用吗? 用VC6.0可以吗?这样直接运行程序? 然后再登浏览器看?[/quote] 肯定可以啊 试试不就知道了嘛[/quote] 你好,我这样是可以的,那我之后可以怎么实现在另外一台计算机上通信?[/quote] 比如这个exe在10.1.1.123这台机器上 浏览器在10.1.1.45这台机器上 (注意这两台不同的机器得是同一个网段的机器,也就是局域网内的访问, 跨网段的访问需要路由器支持,原因以及路由器的配置方法可以google “NAT”) 你在10.1.1.45上 访问 http://10.1.1.123:12345 就可以了看到网页了 (跨网段的访问则需要访问10.1.1.123:12345经过路由NAT转换之后的外网地址)[/quote] 理解了,然后可以吧Hello web那一段改成相应的html文件也可以吧? 要是实现非局域网通信呢?不好意思,问题有点多。[/quote] 非局域网的访问 不是已经告诉你了 google “NAT” 了嘛 非局域网的访问 不是通过写程序就能实现的, 需要在路由器上做配置, 比如在路由器上把10.1.1.123:12345 转换成外网可访问的比如配置成 20.21.22.23:12345, 然后访问http://20.21.22.23:12345
zilaishuichina 2014-11-07
  • 打赏
  • 举报
回复
引用 13 楼 Red_Up 的回复:
[quote=引用 10 楼 zilaishuichina 的回复:] [quote=引用 9 楼 Red_Up 的回复:] [quote=引用 8 楼 zilaishuichina 的回复:] 以上代码是windows下的 linux的同理
我是win7,64位也一样用吗? 用VC6.0可以吗?这样直接运行程序? 然后再登浏览器看?[/quote] 肯定可以啊 试试不就知道了嘛[/quote] 你好,我这样是可以的,那我之后可以怎么实现在另外一台计算机上通信?[/quote] 比如这个exe在10.1.1.123这台机器上 浏览器在10.1.1.45这台机器上 (注意这两台不同的机器得是同一个网段的机器,也就是局域网内的访问, 跨网段的访问需要路由器支持,原因以及路由器的配置方法可以google “NAT”) 你在10.1.1.45上 访问 http://10.1.1.123:12345 就可以了看到网页了 (跨网段的访问则需要访问10.1.1.123:12345经过路由NAT转换之后的外网地址)
Red_Up 2014-11-07
  • 打赏
  • 举报
回复
引用 10 楼 zilaishuichina 的回复:
[quote=引用 9 楼 Red_Up 的回复:] [quote=引用 8 楼 zilaishuichina 的回复:] 以上代码是windows下的 linux的同理
我是win7,64位也一样用吗? 用VC6.0可以吗?这样直接运行程序? 然后再登浏览器看?[/quote] 肯定可以啊 试试不就知道了嘛[/quote] 你好,我这样是可以的,那我之后可以怎么实现在另外一台计算机上通信?
勤奋的小游侠 2014-11-06
  • 打赏
  • 举报
回复
引用 3 楼 Red_Up 的回复:
[quote=引用 1 楼 lovesmiles 的回复:] 你要确定你是要搭建 还是开发一个web server? 你确实老师不是让你写一些html网面在这上面建 个网站什么的吗? 好吧,如果你真的要写个支持http的服务器应用。我给个思路给你: 1学习好socket编程 2有了socket基础,写一个tcp服务端的程序,这个程序的端口号用80,或者8080,这是http服务的默认端口号。 3在浏览器中输入ip地址访问网站时,浏览器会发起tcp连接。 4这个服务端要响应这个tcp连接(这是基本的socket编程) 5tcp连接建立之后,浏览器会根据http协议发一些文字上来(这个时候你可以在服务端用read将这些数据读出来,然后打钱出来看看它都发了什么上来)。 6到了这一步,就是要细仔学http协议的时候了。浏览器发的一些文字,其实都是有意义的,遵守了http协议。比如这时浏览发了一个“get”字符器上来。服务器就要把网页的内容返回给它。这时你可以随便找个html文件。服务器用fopen打开,然后把整个文件内容返回给浏览器(这个过程要遵守http上的规定)。 这样的,你的服器软件就开发完成了,至少浏览器打开你的IP时,就可以看到你的html网页了。
首先谢谢你了,这么认真的回复我。 老师是让我们弄出一个服务器出来,不知道是属于“搭建”还是“开发”? 看完你给的思路之后我还有一些疑惑想问问。(服务器小白,见谅。) 1、比较简易的方法就是在Linux上用C或C++实现吗?也就是你说的Socket编程? 2、那么我文中提到的建立服务器的进(线)程结构怎么实现的,能给个思路吗? 3、浏览器发来的请求也是在用Socket编程出来的程序中解读吗?[/quote] 真要在linux编程就不简单,开发调试什么的都很麻烦。 *针对每一请求建立一子进程为之服务;--这个可以用fork函数实现 *针对每一请求建立一线程为之服务;--这个可以用pthread线程函数实现。 在linux下面的socket编程有一个叫select和epoll的模型,这二个东西都可以实现你说的并发需求。 浏览器跟服务器通信的基础是http协议,这个协议是在应用层,网络层是用tcp实现的。 浏览器和服务器建立了tcp连接,然后按http的规定,发送http命令(其实就是字符串)给服务器。所以你的服务器程序只要识别出这些字符串是什么意义,然后返回对应的字符串给它们就行了,整个过程就是模拟http协议的实现。
Red_Up 2014-11-06
  • 打赏
  • 举报
回复
引用 1 楼 lovesmiles 的回复:
你要确定你是要搭建 还是开发一个web server? 你确实老师不是让你写一些html网面在这上面建 个网站什么的吗? 好吧,如果你真的要写个支持http的服务器应用。我给个思路给你: 1学习好socket编程 2有了socket基础,写一个tcp服务端的程序,这个程序的端口号用80,或者8080,这是http服务的默认端口号。 3在浏览器中输入ip地址访问网站时,浏览器会发起tcp连接。 4这个服务端要响应这个tcp连接(这是基本的socket编程) 5tcp连接建立之后,浏览器会根据http协议发一些文字上来(这个时候你可以在服务端用read将这些数据读出来,然后打钱出来看看它都发了什么上来)。 6到了这一步,就是要细仔学http协议的时候了。浏览器发的一些文字,其实都是有意义的,遵守了http协议。比如这时浏览发了一个“get”字符器上来。服务器就要把网页的内容返回给它。这时你可以随便找个html文件。服务器用fopen打开,然后把整个文件内容返回给浏览器(这个过程要遵守http上的规定)。 这样的,你的服器软件就开发完成了,至少浏览器打开你的IP时,就可以看到你的html网页了。
首先谢谢你了,这么认真的回复我。 老师是让我们弄出一个服务器出来,不知道是属于“搭建”还是“开发”? 看完你给的思路之后我还有一些疑惑想问问。(服务器小白,见谅。) 1、比较简易的方法就是在Linux上用C或C++实现吗?也就是你说的Socket编程? 2、那么我文中提到的建立服务器的进(线)程结构怎么实现的,能给个思路吗? 3、浏览器发来的请求也是在用Socket编程出来的程序中解读吗?
Red_Up 2014-11-06
  • 打赏
  • 举报
回复
首先谢谢你了,这么认真的回复我。 老师是让我们弄出一个服务器出来,不知道是属于“搭建”还是“开发”? 看完你给的思路之后我还有一些疑惑想问问。(服务器小白,见谅。) 1、比较简易的方法就是在Linux上用C或C++实现吗?也就是你说的Socket编程? 2、那么我文中提到的建立服务器的进(线)程结构怎么实现的,能给个思路吗? 3、浏览器发来的请求也是在用Socket编程出来的程序中解读吗?
勤奋的小游侠 2014-11-06
  • 打赏
  • 举报
回复
你要确定你是要搭建 还是开发一个web server? 你确实老师不是让你写一些html网面在这上面建 个网站什么的吗? 好吧,如果你真的要写个支持http的服务器应用。我给个思路给你: 1学习好socket编程 2有了socket基础,写一个tcp服务端的程序,这个程序的端口号用80,或者8080,这是http服务的默认端口号。 3在浏览器中输入ip地址访问网站时,浏览器会发起tcp连接。 4这个服务端要响应这个tcp连接(这是基本的socket编程) 5tcp连接建立之后,浏览器会根据http协议发一些文字上来(这个时候你可以在服务端用read将这些数据读出来,然后打钱出来看看它都发了什么上来)。 6到了这一步,就是要细仔学http协议的时候了。浏览器发的一些文字,其实都是有意义的,遵守了http协议。比如这时浏览发了一个“get”字符器上来。服务器就要把网页的内容返回给它。这时你可以随便找个html文件。服务器用fopen打开,然后把整个文件内容返回给浏览器(这个过程要遵守http上的规定)。 这样的,你的服器软件就开发完成了,至少浏览器打开你的IP时,就可以看到你的html网页了。
Red_Up 2014-11-06
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
参考apache源代码。
不懂得圈我需要的部分。
Red_Up 2014-11-06
  • 打赏
  • 举报
回复
引用 4 楼 lovesmiles 的回复:
[quote=引用 3 楼 Red_Up 的回复:] [quote=引用 1 楼 lovesmiles 的回复:] 你要确定你是要搭建 还是开发一个web server? 你确实老师不是让你写一些html网面在这上面建 个网站什么的吗? 好吧,如果你真的要写个支持http的服务器应用。我给个思路给你: 1学习好socket编程 2有了socket基础,写一个tcp服务端的程序,这个程序的端口号用80,或者8080,这是http服务的默认端口号。 3在浏览器中输入ip地址访问网站时,浏览器会发起tcp连接。 4这个服务端要响应这个tcp连接(这是基本的socket编程) 5tcp连接建立之后,浏览器会根据http协议发一些文字上来(这个时候你可以在服务端用read将这些数据读出来,然后打钱出来看看它都发了什么上来)。 6到了这一步,就是要细仔学http协议的时候了。浏览器发的一些文字,其实都是有意义的,遵守了http协议。比如这时浏览发了一个“get”字符器上来。服务器就要把网页的内容返回给它。这时你可以随便找个html文件。服务器用fopen打开,然后把整个文件内容返回给浏览器(这个过程要遵守http上的规定)。 这样的,你的服器软件就开发完成了,至少浏览器打开你的IP时,就可以看到你的html网页了。
首先谢谢你了,这么认真的回复我。 老师是让我们弄出一个服务器出来,不知道是属于“搭建”还是“开发”? 看完你给的思路之后我还有一些疑惑想问问。(服务器小白,见谅。) 1、比较简易的方法就是在Linux上用C或C++实现吗?也就是你说的Socket编程? 2、那么我文中提到的建立服务器的进(线)程结构怎么实现的,能给个思路吗? 3、浏览器发来的请求也是在用Socket编程出来的程序中解读吗?[/quote] 真要在linux编程就不简单,开发调试什么的都很麻烦。 *针对每一请求建立一子进程为之服务;--这个可以用fork函数实现 *针对每一请求建立一线程为之服务;--这个可以用pthread线程函数实现。 在linux下面的socket编程有一个叫select和epoll的模型,这二个东西都可以实现你说的并发需求。 浏览器跟服务器通信的基础是http协议,这个协议是在应用层,网络层是用tcp实现的。 浏览器和服务器建立了tcp连接,然后按http的规定,发送http命令(其实就是字符串)给服务器。所以你的服务器程序只要识别出这些字符串是什么意义,然后返回对应的字符串给它们就行了,整个过程就是模拟http协议的实现。[/quote] 我查点资料屡屡你这个思路~基础有点差~谢谢了哈。
zilaishuichina 2014-11-06
  • 打赏
  • 举报
回复
引用 9 楼 Red_Up 的回复:
[quote=引用 8 楼 zilaishuichina 的回复:] 以上代码是windows下的 linux的同理
我是win7,64位也一样用吗? 用VC6.0可以吗?这样直接运行程序? 然后再登浏览器看?[/quote] 肯定可以啊 试试不就知道了嘛
Red_Up 2014-11-06
  • 打赏
  • 举报
回复
引用 8 楼 zilaishuichina 的回复:
以上代码是windows下的 linux的同理
我是win7,64位也一样用吗? 用VC6.0可以吗?这样直接运行程序? 然后再登浏览器看?
zilaishuichina 2014-11-06
  • 打赏
  • 举报
回复
以上代码是windows下的 linux的同理
zilaishuichina 2014-11-06
  • 打赏
  • 举报
回复
这是一个最简单的web服务器示例 运行起来之后 打开你的浏览器,输入http://127.0.0.1:12345 他会返回给你一个网页 显示“hello web!”

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <mswsock.h>

#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib , "ws2_32.lib")

#define MAXLINE 4096

int main(int argc, char* argv[])
{
	SOCKET listenfd, connfd;
	struct sockaddr_in servaddr;
	char buff[MAXLINE];
	int n;

	WSADATA WSAData;
	if (WSAStartup(MAKEWORD(2,2),&WSAData) != 0)
	{
		printf("WSAStartup error: %d\n", GetLastError());
		getchar();
		exit(0);
	}
	
	if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
	{
		printf("create socket error: %d\n", GetLastError());
		getchar();
		exit(0);
    }

	memset(&servaddr, 0, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port = htons(12345);

	if(bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
	{
		printf("bind socket error: %d\n", GetLastError());
		getchar();
		exit(0);
	}

	if( listen(listenfd, 10) == -1)
	{
		printf("listen socket error: %d\n", GetLastError());
		getchar();
		exit(0);
	}

	while(true)
	{
		printf("======waiting for client's request======\n");
		if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)
		{
			printf("accept socket error: %d\n", GetLastError());
			continue;
		}

		while (true)
		{
			n = recv(connfd, buff, MAXLINE, 0);
			if (0 == n)
			{
				break;
			}
			buff[n] = '\0';
			printf("recv msg from client: %s\n", buff);

			char *httphead = "HTTP/1.1 200 OK\r\nContent-type:text/html\r\nContent-length:66\r\nConnection: close\r\n\r\n";
			char *httpbody = "<!doctype html><html><head></head><body>hello web!</body></html>\r\n";
			send(connfd, httphead, strlen(httphead), 0);
			send(connfd, httpbody, strlen(httpbody), 0);
		}
			
		closesocket(connfd);
	}

	closesocket(listenfd);

	return 0;
}
Lingxy 2014-11-06
  • 打赏
  • 举报
回复
参考Spserver 源代码。
赵4老师 2014-11-06
  • 打赏
  • 举报
回复
参考apache源代码。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧