设为首页 加入收藏

TOP

windows下的C++ socket服务器(二)
2014-04-06 17:34:33 来源: 作者: 【 】 浏览:193
Tags:windows   socket 服务器

 

  关于其他的发送和接收函数

  recvfrom/sendto

  这两个函数一般用在UDP中。

  函数原型如下

  int recvfrom(SOCKET s,char FAR * buf,int len,int flags,struct sockaddr FAR * from,int FAR * fromlen);

  int sendto(SOCKET s,const char FAR * buf,int len,int flags,const struct sockaddr FAR * to,int tolen);

  2 stringstream sstream;

  字符串读写流,这里用于将char buf[1024]的数据按默认的间隔符读到cmd和filename中,关于cmd和filename的具体含义见3

  也可以用来将数字转换为字符串

  例如

  stringstream sstream;

  sstream <<123456789;

  string a;

  sstream >> a;

  cout << a << endl;

  将数字123456789转换为了字符串

  3 HTTP协议请求

  当客户端连接到服务端时,会发出一个http请求

  http请求由三部分组成,分别是:请求行、消息报头、请求正文

  这里只对请求行进行介绍

  请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF

  其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。

  请求方法(所有方法全为大写)有多种,各个方法的解释如下:

  GET 请求获取Request-URI所标识的资源

  POST 在Request-URI所标识的资源后附加新的数据

  HEAD 请求获取由Request-URI所标识的资源的响应消息报头

  PUT 请求服务器存储一个资源,并用Request-URI作为其标识

  DELETE 请求服务器删除Request-URI所标识的资源

  TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断

  CONNECT 保留将来使用

  OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

  在本程序中只对GET请求进行处理,将请求方法读入cmd中,和Request-URL读入filename中,判断是否为GET,并获请求的资源名称

  4 file.open(filename ,ifstream::binary);

  打开客户所请求的文件,这里使用二进制的方式打开是为了方便对图片进行传输

  5 string head = "HTTP/1.0 200 OK\r\nContent - type:text/plain\r\n\r\n";

  在接收和解释请求消息后,服务器返回一个HTTP响应消息。

  HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文

  1)、状态行格式如下:

  HTTP-Version Status-Code Reason-Phrase CRLF

  其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。

  常见状态代码、状态描述、说明:

  200 OK //客户端请求成功

  400 Bad Request //客户端请求有语法错误,不能被服务器所理解

  401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用

  403 Forbidden //服务器收到请求,但是拒绝提供服务

  404 Not Found //请求资源不存在,eg:输入了错误的URL

  500 Internal Server Error //服务器发生不可预期的错误

  503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

  Content-Type表示正在传输的类型

  Content - type:text/plain:普通文本

  Content - type:text/html:html网页

  Content - type:image/png:png图片

  Content - type:image/jpg:jpg图片

  2)响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。在这不做详细介绍

  3)响应正文就是服务器返回的资源的内容

  关于http协议更详细的部分可以参照http://blog.csdn.net/gueter/article/details/1524447 HTTP协议详解

  6 获得响应正文并写到客户端

  char buf[1024];

  memset(buf, 0, sizeof(buf));//初始化

  file.read(buf,sizeof(buf)-1);//由于我们使用二进制的方式打开的文件所以使用了read方法

  int n = file.gcount();//gcount()返回最后一个非格式化的抽取方法读取的字符数,因为有时候读到的会小于1023个

  send(socket_fd, buf,n,0);//将buf中的n个字符发送到客户端

  7

  file.close()和closesocket(socket_fd)

  关闭打开的文件和socket_fd

  p.s

  程序做的还不是很完善,对一些情况比如send,reve是否正在执行也没有进行检查,客户端请求的文件不存在也没有返回404,

  我会在以后对程序进行完善的,并将一些新的心得写出来。

      

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++通过OCCI操作Oracle数据库 下一篇全排列算法之Perm算法实现

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)
·Redis配置中`require (2025-12-26 03:18:58)
·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)