1.在写基于HTTP协议的的通用型服务器时遇到的问题(和要注意的点)。
关闭防火墙,我的Linux是centos6.5 关闭防火墙的方法是service iptables stop
2.每一个网站都要有一个logo 在/favicon.ico中,是一个图片文件,浏览器访问文件时是会顺便访问(所以会有两个GET)
3.在我们传参数时如遇特殊符号就涉及到了URLENCODE编码问题
URLENCODE网站
3.出现乱码的原因可能是解码和编码的方式不对称
解决方法知道自己的编码方式,并让浏览器按编码相对应的解码方式解码
查自己的编码格式,取决于而当前的文件编辑器
打开当前文件的命令行模式,并输入 set fileencoding,按下回车就可以显示出来
下面要做的就是提示浏览器按照utf-8方式解码
我们可以在一个网页中按下F12,并打开head部分,可以看到灰色字体
把这句话加到只自己的代码里就行了,先点击鼠标右键,编辑HTML,然后再复制粘贴
这样就告诉了浏览器按什么方式解码
下面我们运行一下
这时虽然问题解决了但是如果放在老式的浏览区中可能还是会出现问题,是因为老式的浏览器有可能不可以很好的解读body部分中我们刚刚加上的那句话,这里我们需要在head部分已而加上同样作用的话做一个双重保证,使程序的健壮性更高
与上面一样我们需要抓一个包,这次我们用fiddler这个软件,方法和上面类似
3.地址已经被占用问题
谁先断开谁先进入timewaiter转态,要有一段时间保证最后一个应答的到来,
我们让服务器率先断开再连时就会发上一下情况,
提示说地址已经被占用
下来我们就来看一下
我们可以看到服务器是在的确等待状态
问题来了,谁先断开谁先进入timewaite转态,要有一段时间保证最后一个应答的到来,如果一段时间服务器承受的请求非常多,就很有可能是服务器出像大量的timewait状态
就要消耗大量的端口号。新的请求就没有办法去处理,这时可以用 setsockopt(listen_sock,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof (opt));//加上这个函数是为了使端口处于TIME-
WAIT时复用地址
&opt,sizeof (opt)是因为类型不定所以用void*传参
(额外如果出现了大量的TIME-WAIT说明服务器说先断开连接,如出现大量的这种状态就要消耗大量的端口号。新的请求就没有办法去处理,这时可以用 setsockopt(listen_sock,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof (opt));//加上这个函数是为了使端口处于TIME-
WAIT时复用地址
如果出现了大量的CLOSE-WAIT说明代码有BUG,因为服务器不能正常的断开连接,应回头找BUG)
4.HTTP服务器的根目录:用户指定的任意一个存在的目录
Url_path 中访问的文件,都是HTTP服务器中人为指定的根目录为基准取相对目录
分两种情况 ,如果url_path是一个文件,南无在前面加上根目录就可以了
如果是目录,就给这个目录后追加一个index.html
5.可以用但是不好的方法(下面是示意图)我们知道用户态和内核态的转换是非常大的
不如直接用如下方法
6.要lrzsz的安装(文件收发工具)