- 浏览: 270638 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
AndMacLinuXp:
试了下,不错!
printk内核调试 -
klose:
我引用你的文章,并做了简单的分析:这里贴出url:http:/ ...
linux系统调用fork, vfork, clone -
klose:
你上面提到的问题:free的问题。首先你可能疏忽了,stack ...
linux系统调用fork, vfork, clone -
qwe_rt:
HI ,非常nice的文章,在阅读过程中,我发现我的ubunt ...
linux手动添加开机启动的服务 -
suifeng:
谢谢分享, 受用中.
shell编程分支,循环
HTTP请求头部样例:
GET http://www.baidu.com/ HTTP/1.1
Accept: html/text
Host: 220.181.6.175:80
Connection: Close
这是一个请求百度页面的头部。
属性和值的命名中间用:和空格隔开,结尾使用\r\n,头部结束使用\r\n\r\n
GET表示采用GET方法,当然我们常见的还有POST等其他方法,具体每个方法的意义可以查看RFC文档(附件)。
http://www.baidu.com/请求URL的绝对地址,如果使用相对地址可以改为/或者/index.html.注:后面的/不能少。
HTTP/1.1 版本号
Accept 接受响应的类型
Host请求的主机地址和端口
Connection:如果值为close则告诉服务器,当本次数据传递完毕以后,就会断开TCP链接。如果值为Keep-Alive则告诉服务器,数据传输结束后,本次链接不断开,等待后续请求。
用SOCKET模拟递交HTTP请求步骤:
1.首先建立和HTTP服务器的TCP链接
2.组织HTTP请求
3.发送请求
4.获取响应
一个下载百度首页的例子:
#include "stdlib.h"
#include "sys/types.h"
#include "sys/socket.h"
#include "netinet/in.h"
#include "netdb.h"
#include "string.h"
#include "arpa/inet.h"
#include "ctype.h"
#include "stdio.h"
#include "sys/stat.h"
#include "fcntl.h"
void send_and_recv(int sockfd, char * url, char * fun_type, char * accept_type, char * ip, int port, char * file_loc, char * body, char * connection_type);
//sockfd表示TCP链接的套接字,url请求服务的相对或者绝对地址,fun_type请求方法,accept_type接受类型,ip,port请求的服务器的地址和端口,file_loc下载文件存放位置,body请求的主体,connection_type用来指定connection的类型
int main() {
int sockfd;
struct sockaddr_in serv_socket;
int port = 80;
char ip[] = "220.181.6.175"; //ip地址,可以通过gethostbyname来获取
char file_loc[] = "/programe/http/temp.html"; //下载的存放位置
bzero(&serv_socket, sizeof(struct sockaddr_in));
serv_socket.sin_family = AF_INET;
serv_socket.sin_port = htons(port);
inet_pton(AF_INET, ip, &serv_socket.sin_addr);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
int flag = connect(sockfd, (struct sockaddr *)&serv_socket, sizeof(serv_socket)); //建立和HTTP服务器的TCP链接
if(flag < 0) {
printf("connect error!!! flag = %d\n", flag);
exit(1);
}
send_and_recv(sockfd, "http://www.baidu.com/", "GET", "html/text", ip, port, file_loc, NULL, "Close"); //下载的主体函数
close(sockfd);
exit(0);
}
void send_and_recv(int sockfd, char * url, char * fun_type, char * accept_type, char * ip, int port, char * file_loc, char * body, char * connection_type) {
char * request = (char *) malloc (4 * 1024 * sizeof(char));
if(body)
sprintf(request, "%s %s HTTP/1.1\r\nAccept: %s\r\nHost: %s:%d\r\nConnection: %s\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-L
ength: %d\r\n\r\n%s", fun_type, url, accept_type, ip, port, connection_type, body, strlen(body));
else
sprintf(request, "%s %s HTTP/1.1\r\nAccept: %s\r\nHost: %s:%d\r\nConnection: %s\r\n\r\n", fun_type, url, accept_type, ip, port, connection_type
);
//以上是在组织请求的头部,打印出的结果就是文章开头所写
int send = write(sockfd, request, strlen(request));
printf("%s", request);
free(request);
char * response = (char *) malloc (1024 * sizeof(char));
if(file_loc) {
int file = open(file_loc, O_RDWR | O_APPEND);
int length;
do {
length = read(sockfd, response, 1024);
char * loc = strstr(response, "\r\n\r\n"); //截获返回头部,以\r\n\r\n为标识
if(loc) {
int loci = loc - response + 4;
write(1, response, loci);//如果是响应头部就打印至屏幕
write(file, loc, length - loci);//如果是响应主体就写入文件
} else {
write(file, response, length);
}
if(!length)//注意,因为之前采用的是close方法,也就是说一旦传输数据完毕,则服务器端会断开链接,则read函数会返回0,所以这里会退出循环。如果采用的是Keep-Alive则服务器不关闭TCP链接,也就说程序将会被阻塞在read函数中,因此要注意的是自己判断是否读到了响应的结尾,然后在再次调用read之前退出循环。
break;
} while(1);
close(file);
} else {
int length;
do {
length = read(sockfd, response, 1024);
printf("%s", response);
if(!length)
break;
} while(1);
}
free(response);
}
之前的头部比较简单,在发送请求的时候,我们常常会递交表单,如果采用GET方法,则可以通过URL传递参数。如果采用POST,则新的HTTP请求看上去应该是这样。(带COOKIE)
POST http://192.168.1.154:8888/httpstudy2/servlet/IndexServlet HTTP/1.1
Accept: html/text
Host: 192.168.1.154:8888
Cookie: username=difa; password=yuna
Connection: Close
Content-Type: application/x-www-form-urlencoded
Content-Length: 29
username=hello&password=world
Content-Type表示主体类型
Content-Length表示主体长度,不包括头部。
整个发送的HTTP请求应该是:
POST http://192.168.1.154:8888/httpstudy2/servlet/IndexServlet HTTP/1.1\r\nAccept: html/text\r\nHost: 192.168.1.154:8888\r\nCookie: username=difa; password=yuna\r\nConnection: Close\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 29\r\n\r\nusername=hello&password=world
- 070810123217.pdf (695.6 KB)
- 下载次数: 61
发表评论
-
hdfs集群搭建
2014-05-11 17:19 1045网上很多hadoop集群搭建的文章,我这里只写下hdfs,不 ... -
网站性能优化
2013-10-25 10:43 0好久没写了,最近一直在做些互联网的一些东西。下面介绍些性能优 ... -
html5学习网站
2011-07-29 14:55 955htm5:http://www.w3school.com.cn ... -
HTTP下载
2011-02-09 15:24 1127HTTP下载的关键是修改Content-Type。 C ... -
28.sniffer程序2
2010-07-01 17:51 1800对前面27中sniffer中的一 ... -
27. sniffer程序
2010-06-30 11:51 5959网络抓包,必需从数据链路层开始抓取,至于原因之前在原始套接口中 ... -
java 和 linux c udp通信的样例
2010-05-28 11:58 2504一个简单的例子 java段(客户端) package ... -
26.原始套接字
2010-05-12 16:45 1828一个小程序: //发送方 #include <sys ... -
25.cookies和session
2010-05-10 15:21 968原文出自:http://blog.csdn ... -
23.广播
2010-04-29 16:34 969如果想发送广播到目前为止只能使用AF_INET, SOCK_D ... -
22.非阻塞connect
2010-04-28 11:36 2777connect非阻塞套接口时候,一般使用在以下几种情况: ... -
21.非阻塞I/O
2010-04-27 16:54 2099设置一个I/O成为非阻塞很简单,只需要: int val = ... -
20.辅助数据 和 传输描述字
2010-04-26 15:53 2118打开一个文件或者一个 ... -
19.unix域协议与TCP UDP不同之处
2010-04-22 13:46 2670之前说过一些区别,但基本对我们编程来说没有太多影响,但以下几个 ... -
18.unix域协议
2010-04-21 16:47 2662UNIX域协议并不是一个真正的协议族,它是用在同一台主机上进行 ... -
17.I/O函数recvmsg与sendmsg
2010-04-20 15:58 12484想对于之前的几个IO函 ... -
16.I/O函数
2010-04-20 13:51 1282最早使用的read与write函 ... -
15.服务器守护进程
2010-04-16 17:44 1423前面提到过的服务器都占有控制终端。而有些进程并不需要控制终端。 ... -
14.udp与connect
2010-04-13 16:41 3254UDP在调用sendto发送数据 ... -
13.UDP编程
2010-04-09 17:16 2307虽然UDP不保证传输的可 ...
相关推荐
在使用Socket模拟HTTP请求时,我们首先需要创建一个Socket实例,连接到指定的Web服务器IP地址和端口号(通常是80)。然后,我们将HTTP请求以字符串形式构造,包括上述的请求行、头部和可能的请求体。接下来,我们将...
在Android平台上,我们可以利用Socket编程来模拟一个简单的HTTP服务器,以提供本地文件系统中的资源,如HTML文件,供外部设备(如浏览器)访问。这个过程涉及到Android系统的网络权限管理、Socket编程以及HTTP协议的...
本主题聚焦于“socket http/https 模拟登录 请求页面”,这些概念都是网络编程中的核心元素。以下是对这些概念的详细解释: **Socket**: Socket是网络通信的基本构建块,它提供了一个低级别的接口,允许程序通过...
它允许研发者模拟各种HTTP请求,包括GET、POST、PUT、DELETE等多种方法,以便于验证服务器端的接口功能是否正常工作。下面将详细阐述Postman的主要特点和使用方法。 1. **请求模拟**: - GET请求:用于获取资源,...
在C#编程语言中,使用Socket类可以实现底层的网络通信,包括模拟HTTP请求。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,用于从万维网服务器传输超文本到本地浏览器的传输协议。Socket则提供了低...
采用JAVA的socket实现http协议,模拟浏览器访问服务端。
Socket测试工具、模拟通信测试
在本文中,我们将深入探讨Socket模拟服务器的相关知识点,以及如何实现网络通讯数据的接收和处理。 首先,Socket是一种网络通信协议接口,它允许应用程序通过网络进行双向通信。在Java中,Socket类和ServerSocket类...
这个工具就是一个能在线模拟socket通讯工具,并且能检测通讯是否能正常响应和发送信息
编写一个网络服务器的模拟程序: 从一个SOCKET监听网络请求,并进行处理. 网络用户可发来四类请求A/B/C/D/E. 每个类请求分别用一个函数处理. A请求的处理函数是睡眠1秒钟, B请求的处理函数是睡眠2秒钟, C请求的处理...
在我们的"JAVA socket 模拟聊天室"项目中,服务器端需要使用`ServerSocket`监听特定端口,等待客户端的连接请求。一旦客户端使用`Socket`发起连接,服务器端的`accept()`方法将阻塞直到连接建立。连接建立后,双方就...
编写一个网络服务器的模拟程序: 从一个SOCKET监听网络请求,并进行处理. 网络用户可发来四类请求A/B/C/D/E. 每个类请求分别用一个函数处理. A请求的处理函数是睡眠1秒钟, B请求的处理函数是睡眠2秒钟, C请求的处理...
当我们谈论"socket下载http"时,通常是指使用Socket编程来实现HTTP客户端,模拟浏览器发送HTTP请求到服务器,然后接收服务器返回的文件数据。HTTP请求通常包括方法(如GET或POST)、URL、协议版本、头部和可能的主体...
本文将基于提供的标题“模拟http服务器(socket使用)”和描述,深入探讨如何使用Socket来构建一个简单的HTTP服务器。我们将涵盖以下几个关键点: 1. **HTTP协议基础**: HTTP(超文本传输协议)是互联网上应用最...
在这个场景中,"TCP socket请求报文发送工具"是一种实用的软件工具,它能够帮助用户模拟TCP请求或者执行简单的socket请求,无需安装,属于绿色便携版。 首先,TCP请求报文的结构包括以下几个主要部分: 1. **源...
总结起来,"Socket模拟客户端与服务端"的实践涉及到TCP协议、Socket编程以及两端的交互逻辑。通过"WindowsApplication1"和"WindowsApplication2"这两个应用程序,我们可以学习到如何在Windows环境下实现TCP Socket...
1. **WebSocket协议**:Socket.IO基于WebSocket协议,WebSocket是HTML5中的一项技术,提供了全双工的通信通道,使得服务器和客户端可以实时交换数据,不再受限于HTTP的请求-响应模式。这在需要实时性(如在线聊天、...
- 如果需要,可以使用WebSocket保持长连接,以模拟Socket的实时性。 #### 五、总结 通过本文的介绍,我们不仅了解了如何使用Socket技术实现点对点的文件传输,还探讨了如何将Socket通信转换为HTTP协议下的通信...
博客:【安卓学习之工具学习】网络通信测试工具-socket/post/get 的附件,博客连接为:http://blog.csdn.net/ljb568838953/article/details/52493675 附件里面含: fiddlersetup_v4.6.2.0.32002.exe NetAssist_v4.2....