今天用 c 的 socket() 模拟发送http请求:上传一张图片到服务器。

在本地测试,本地电脑: xp, iis5.1

经过半天时间对 http post file 协议的了解,代码已经写好,测试发现,socket使用http协议上传文件,服务器端已经可以正常的接收,并保存数据到新生成的文件中,但是 客户端 socket 发送完所有数据,然后读取服务器端返回的数据时,显示结果:

HTTP/1.1 100 Continue

Server: Microsoft-IIS/5.1

Date: Mon, 31 Mar 2014 05:52:22 GMT

X-Powered-By: ASP.NET

并不是我所期望的 HTTP/1.1 200 OK

在网上不断的搜索相关资料,找到原因:

100状态码 的目的在于允许客户端判定服务器是否愿意接受客户端发来的消息主体(基于请求头域)在客户端发送此请求消息主体前。 在有些情况下,如果服务器拒绝查看消息主体,这时客户端发送消息主体是不合适的或会降低效率。)

就是说 ‍Expect:100-Continue的作用是,设定Client 和 Server在Post数据前需要进行 ‍“请求头域” 的数据匹配,相当于是握手。如果匹配则开始进行body 的内容,Post数据。否则,报错(417) Unkown。

来源: http://hi.baidu.com/leo_han/item/9bdd1068bc6f7131ad3e8333

其他相关资料:http://zhidao.baidu.com/question/396434329.html

http://www.laruence.com/2011/01/20/1840.html

我仔细检查了源代码,发送的http header中没有与 Expect:100-Continue 相关的任何数据。

我后来测试上传图片到 win2003(iis6.0)上,就可以正常的返回 HTTP/1.1 200 OK

这就是说,上传到不同的系统不同的服务器上,有可能返回 HTTP/1.1 100 Continue,也有可能不返回。

那在代码中,send()完 http header 部分后,我该怎么办?

我测试了,如果发送完 http header 部分,然后先 recv(), 如果遇到 iis5.1 会马上接收到 HTTP/1.1 100 Continue

可遇到 iis6.0,就会阻塞住,直到 recv timeout, 这会严重影响处理的性能。

接收也不是,不接收也不是。

解决办法就是,发送完数据后,接收到两段消息,写程序过滤掉 HTTP/1.1 100 Continue,检查是否有HTTP/1.1 200 OK:

HTTP/1.1 100 Continue

Server: Microsoft-IIS/5.1

Date: Mon, 31 Mar 2014 07:12:52 GMT

X-Powered-By: ASP.NET

HTTP/1.1 200 OK

Server: Microsoft-IIS/5.1

Date: Mon, 31 Mar 2014 07:12:52 GMT

X-Powered-By: ASP.NET

Connection: close

Content-Length: 18

Content-Type: text/html; Charset=utf-8

Set-Cookie: ASPSESSIONIDAQDQBASB=APILENHAPOJMNCDIANAHGHJM; path=/

Cache-control: private

abc123131abcefgkad

----------------------------------------------------------------------------------------------

http post file 简单协议,我的了解是这样:

POST /up/test.asp?action=submit HTTP/1.1

Accept: */*

Accept-Language: zh-cn

User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA)

Host: www

Content-Type: multipart/form-data; boundary=x580xo3z1x2yemam

Content-Length: 144

Connection: close

\r\n

--x580xo3z1x2yemam

Content-Disposition: form-data; name="pic"; filename="x.txt"

Content-Type: image/jpeg

\r\n

文件内容[二进制数据]

--x580xo3z1x2yemam--\r\n

其中这里的 Content-Length: 144 特别需要注意, 这个 144 = 上面黑色粗体的所有内容加起来的 size

来源:http://blog.csdn.net/ruixj/article/details/5986063#t2

来源:http://www.cnblogs.com/cswuyg/archive/2013/07/11/3185164.html

来源:http://blog.csdn.net/xiaojianpitt/article/details/6856536

关于 http header 详细的介绍:

http://www.cnblogs.com/pipelone/archive/2009/03/26/1422140.html

2014-03-31

HTTP/1.1 100 Continue - I 服了 You的更多相关文章

  1. HTTP报文中的100状态码

    HTTP状态码(status codes)是HTTP协议中,响应报文的起始行中包含的一种服务器用于向客户端说明操作状态的三位数字.例如在一个正常的GET请求完成后,服务器会向客户端返回 HTTP/ O ...

  2. shell 100

    1.编写hello world脚本 #!/bin/bash# 编写hello world脚本 echo "Hello World!"2.通过位置变量创建 Linux 系统账户及密码 ...

  3. 快速入门:Python简单实例100个(入门完整版)

    Python3 100例 文章目录 Python3 100例 实例001:数字组合 实例002:“个税计算” 实例003:完全平方数 实例004:这天第几天 实例005:三数排序 实例006:斐波那契 ...

  4. Linux记录-shell 100例(转载)

    1.编写hello world脚本 #!/bin/bash # 编写hello world脚本 echo "Hello World!" 2.通过位置变量创建 Linux 系统账户及 ...

  5. python break/continue - python基础入门(10)

    在昨天的文章:python while循环 文章结尾,我们留下了一个bug,当条件成立时,程序陷入了死循环,如何解决呢?     为了规避这个问题,今天介绍两个关键词:break和continue. ...

  6. HTTP 1.1, 返回值100.

    HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401.客户端如果接受到100,才开始把请求body发送到服务器. 这样 ...

  7. Python break/continue - Python零基础入门教程

    目录 一.break 二.continue 三.重点总结 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 Python wh ...

  8. shell编程100列

    1.编写hello world脚本 #!/bin/bash# 编写hello world脚本 echo "Hello World!"2.通过位置变量创建 Linux 系统账户及密码 ...

  9. 每天一个 HTTP 状态码 100

    100 Continue 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分:指示客户端应该继续当前请求:如果请求已经完成,客户端可以忽略该响应. 常用于服务器已经接受了请求头,客户端应该继续 ...

随机推荐

  1. QQ群管理员申请帖(本次截止日期为2017-03-25)

    本帖专门为技术交流群申请管理员专用. 管理员的权利: 1.有权在成员违规的情况下直接剔除. 2.有权加入多个交流群. 3.有权引人入群. 4.艾特全体是权利,但要慎用,通常情况下,没有我本人的授意,不 ...

  2. Webpack 2 视频教程 007 - 配置 WDS 进行浏览器自动刷新

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  3. Python练习-8

    1,复习 ascii:字母,数字,特殊字符:1个字节,8位 Unicode:16位 两个字节 升级 32 位 四个字节 utf-8:最少一个字节 8位表示. 英文字母 8位 1个字节 欧洲16位,2个 ...

  4. 个人阅读作业 --软件工程M1/M2总结

    软件工程M1/M2总结 写在前面的话: 这学期的软件工程伴着考期的展开逐渐落下帷幕,回顾这学期的软件工程,我感觉我的热情在一次又一次的失落中逐步消耗殆尽,每个人对于这门课的体验都会有所不同吧,可以确定 ...

  5. jeecg的下拉列表

    jeecg里面下拉列表的使用 ①建立数据字典seo_id <t:dictSelect field="operationPromotionAccount" typeGroupC ...

  6. OSG中距离转像素公式(PIXEL_SIZE_ON_SCREEN)

    osgearth_computerangecallback.cpp 中 下面的代码假设:range模式是PIXEL_SIZE_ON_SCREEN,根据距视点的距离计算在屏幕中的像素大小. 像素大小转距 ...

  7. Minify or format javascript file by web or notepad++

    Notepad++ plugin manager install 'JSTOOL' http://tool.oschina.net/codeformat/js https://www.cnblogs. ...

  8. activiti 选人的实现

    activiti默认是不带有选人的功能的,它默认的是在调用complete 方法的时候自动根据下一个节点的 assignee属性或者candidate属性 设置下一节点的候选人或者 assginee. ...

  9. 服务器RAID设置以及简单理解

    备注: 适用于测试环境,生产环境暂时未验证 1. RAID种类 最高性能的RAID0 完全拆分所有的IO 不进行校验 但是单盘损坏, 数据完全丢失 最高损耗的RAID1 损失一半的存储容量, 做镜像, ...

  10. python pip包安装以及几个包的简单用法

    1. centos74 安装完之后默认有python2.7.5 但是没有pip需要自己安装: copy from https://www.cnblogs.com/rain124/p/6196053.h ...