当前位置: 首页 > 知识库问答 >
问题:

C:在linux中发送http get请求

王凌
2023-03-14

我试图在端口80上建立一个连接localhost并发送一个简单的http get请求,同时运行wireshark并查看报头。下面是我的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <pthread.h>
#include <netinet/in.h>
#include <errno.h>
#include <string.h>


int main(int argc, char *argv[])
{

  int yes = 1;
 char buffer[1024];
 int newsockfd, portno, recv_length, sockfd;
 socklen_t clilen;
 struct sockaddr_in serv_addr, cli_addr;
 ssize_t number;
 if (sockfd < 0) 
    error("ERROR opening socket");
 bzero((char *) &serv_addr, sizeof(serv_addr));


  sockfd = socket(AF_INET, SOCK_STREAM, 0);

 serv_addr.sin_family = AF_INET;
 serv_addr.sin_addr.s_addr = 0;
 serv_addr.sin_port = htons(80);




 connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr));


 if(send(sockfd, 


 "GET / HTTP/1.1\r\n
 Host: localhost\r\n
 Connection: Keep-alive\r\n
 Cache-Control: max-age=0\r\n
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,;q=0.8\r\n
 User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.91 Safari/537.36\r\n
 Accept-Encoding: gzip, deflate, sdch\r\n
 Accept-Language: en-US,en;q=0.8\r\n\r\n", 

 strlen("GET / HTTP/1.1\r\n
 Host: localhost\r\n
 Connection: Keep-alive\r\n
 Cache-Control: max-age=0\r\n
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,;q=0.8\r\n
 User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.91 Safari/537.36\r\n
 Accept-Encoding: gzip, deflate, sdch\r\n
 Accept-Language: en-US,en;q=0.8\r\n\r\n"),

 0) > 0)

 {
    printf("GET send from %d\n", sockfd);
 }
 else
 {
    printf("Problem in send %s\n", strerror(errno));
 }

但当我编译并运行它时,它会给我带来很多错误。这是Errros的图像。发生此错误后,我将send函数更改为这个
send(sockfd,“get/http/1.1\r\n host:localhost\r\n\r\n”,strlen(“get/http/1.1\r\n host:localhost\r\n\r\n”)
编译进行得很好,但wireshark显示给我HTTP/1.0 400错误请求(text/html),所以我没有什么问题。
1)我使用过的send函数之间有什么区别?我的意思是,如果我发送
GET/HTTP/1.1\r\n主机:localhost\r\n\r\n

GET/HTTP/1.1\r\n主机:localhost\r\n连接:keep-alive\r\n cache-control:max-age=0\r\n accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp;q=0.8\r\n用户代理:mozilla/5.0(x11;Linux i686)appleWebkit/537.36(KHTML,like Gecko)chrome/40.0.2214.91 safari/537.36\r\n accept-encoding真的有关系吗:gzip,deflate,sdch\r\n accept-language:en-US,en;q=0.8\r\n\r\n
2)如何配置发送函数以发出正确的HTTP GET请求?
希望您能帮助。谢谢。

共有1个答案

酆鸿彩
2023-03-14

字符串中有文字换行符!您需要关闭并重新打开每一行的报价。例如:

if(send(sockfd, 
 "GET / HTTP/1.1\r\n"
 "Host: localhost\r\n"
 "Connection: Keep-alive\r\n"
 "Cache-Control: max-age=0\r\n"
 ...
 类似资料:
  • 向传递的 URL 发出一个 GET 请求。 使用 XMLHttpRequest web API 向给定的 url 发出 get 请求。 通过调用给定的 callback 和 responseText 来处理 onload 事件。 通过运行提供的 err 函数,处理onerror事件。 省略第四个参数 err ,默认将错误记录到控制台的 error 流。 const httpGet = (url,

  • 问题内容: 我正在尝试将Cookie与HttpGet请求一起发送,但是每次尝试都无法成功发送它。我也尝试直接修改标题,这是我的代码: 问题答案: 这实际上是HttpClient 4.0.1的正确实现,我只是没有获得正确的cookie。

  • 我有一个WPF应用程序,需要从远程API检索配置数据。该API已经过测试,并且工作正常,返回我认为是正确的格式。我已经为响应等创建了一个数据类型,但是当我到达通过HttpClient获取响应的行时,它不会向API发送任何请求。 数据类型:- 我已经在API上运行了日志,我们没有看到请求,如果我们使用相同的代码模型调用另一个API控制器来调用Uri2(https://example.com/API/

  • 问题内容: 我正在尝试使用node.js将http请求发送到neo4j数据库。这是我正在使用的代码: 我检查数据库是否正在运行(我已连接到管理网页,并且一切正常。)恐怕问题不在数据库方面,而在node.js方面。 我希望有人可以对此问题有所启发。我想学习如何在node.js中发送http请求,答案不必特定于neo4j问题。 提前致谢 问题答案: 如果是简单的GET请求,则应使用 否则,需要关闭。

  • 问题内容: 我想在每次模拟结束时向我的Gmail帐户发送一封电子邮件。我尝试在网上搜索并发现sendEmail,但超时。如果有人能指出我所尝试的软件包或链接,我将不胜感激。 谢谢 问题答案: 您可以直接使用本地MTA 并向其提供符合RFC822的文本。