当前位置: 技术问答>linux和unix
linux c http编程 如和写post格式!
来源: 互联网 发布时间:2016-07-12
本文导语: http协议中这样写着:GET 请求获取Request-URI所标识的资源。 POST 在Request-URI所标识的资源后附加新的数据。 在网上查到的信息:POST 在一般情况下应该注意2点 一是: content-length: 一定要跟POST中正文长...
http协议中这样写着:GET 请求获取Request-URI所标识的资源。 POST 在Request-URI所标识的资源后附加新的数据。
在网上查到的信息:POST 在一般情况下应该注意2点
一是: content-length: 一定要跟POST中正文长度字节数相等,在你这里就是strlen("name1=value1&name2=value2")
二是: Content-Type: 在给CSDN发帖子时候一定要是 application/x-www-form-urlencoded
一下代码是我在网上搜索的,linux下可以正常运行(需要稍作修改)
#define DestIp "xx.xx.xx.xx"
#define DestPort 9000
#define Req "GET /index.html HTTP/1.1rnHost: xx.xx.xx.xxrnConnection: Closernrn"
#define ReqLen sizeof(Req)
int main(int argc, char *argv[]) {
ssize_t i;
int nRequestLen;
char strResponse[BUFSIZE]={0};
char strRequest[BUFSIZE]={0};
int sockfd, numbytes;
struct sockaddr_in dest_addr; /* connector's address information */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
dest_addr.sin_family = AF_INET; /* host byte order */
dest_addr.sin_port = htons(DestPort); /* short, network byte order */
dest_addr.sin_addr.s_addr = inet_addr(DestIp);
/* Create and setup the connection */
if (connect(sockfd, (struct sockaddr *)&dest_addr,sizeof(struct sockaddr)) == -1) {
perror("connect");
exit(1);
}
/* Send the request */
strncpy(strRequest, Req,ReqLen);
nRequestLen = ReqLen;
if (write(sockfd,strRequest,nRequestLen) == -1) {
perror("write");
exit(1);
}
/* Read in the response */
while(1) {
i = read(sockfd,strResponse,BUFSIZE-1);
if(0 >= i){
break;
}
strResponse[i]='';
printf(strResponse);
}
/* Close the connection */
close(sockfd);
}
当我要用post方法时,红色部分怎么写啊?谢谢。
在网上查到的信息:POST 在一般情况下应该注意2点
一是: content-length: 一定要跟POST中正文长度字节数相等,在你这里就是strlen("name1=value1&name2=value2")
二是: Content-Type: 在给CSDN发帖子时候一定要是 application/x-www-form-urlencoded
一下代码是我在网上搜索的,linux下可以正常运行(需要稍作修改)
#define DestIp "xx.xx.xx.xx"
#define DestPort 9000
#define Req "GET /index.html HTTP/1.1rnHost: xx.xx.xx.xxrnConnection: Closernrn"
#define ReqLen sizeof(Req)
int main(int argc, char *argv[]) {
ssize_t i;
int nRequestLen;
char strResponse[BUFSIZE]={0};
char strRequest[BUFSIZE]={0};
int sockfd, numbytes;
struct sockaddr_in dest_addr; /* connector's address information */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
dest_addr.sin_family = AF_INET; /* host byte order */
dest_addr.sin_port = htons(DestPort); /* short, network byte order */
dest_addr.sin_addr.s_addr = inet_addr(DestIp);
/* Create and setup the connection */
if (connect(sockfd, (struct sockaddr *)&dest_addr,sizeof(struct sockaddr)) == -1) {
perror("connect");
exit(1);
}
/* Send the request */
strncpy(strRequest, Req,ReqLen);
nRequestLen = ReqLen;
if (write(sockfd,strRequest,nRequestLen) == -1) {
perror("write");
exit(1);
}
/* Read in the response */
while(1) {
i = read(sockfd,strResponse,BUFSIZE-1);
if(0 >= i){
break;
}
strResponse[i]='';
printf(strResponse);
}
/* Close the connection */
close(sockfd);
}
当我要用post方法时,红色部分怎么写啊?谢谢。
|
楼主用抓包工具随便抓一个HTTP的包就知道了
|
我也遇到了类似的问题,未果
顶一下
顶一下
|
和get一样,get后面跟的东西你付给了一个字符串,post也一样,只不过post后面跟的东西多,用宏不太好,可以用strcpy或memcpy。
get请求有数据部分吗?数据部分就是要上传的数据,post因为要提交信息,所以有数据部分。
get请求有数据部分吗?数据部分就是要上传的数据,post因为要提交信息,所以有数据部分。
|
这只是HTTP请求头,GET方式数据是放在请求头里一并发送的,POST方式是另外发送的,参考我前面给你的回帖,第一步,发送HTTP请求头,第二步,发送带有这类标志-----------------------------7d938a660866
Content-Disposition: form-data; name="FILE1"; filename="aaa.txt"
Content-Type: application/octet-streamrnrn这里放你的数据,数据最后再加一个-----------------------------7d938a660866--,再具体的,你查一下吧,以前做过这个,忘记了
|
推荐lz用wireshark抓包看一下再把相应的替换即可