Linux下用c语言实现发送http请求

2019-07-12 21:43发布

class="markdown_views prism-atom-one-light">

前言

在linux下,使用socket进行编程,需要到服务器上进行获取数据,服务器使用的php编程,需要使用http的方式进行获取数据。

代码

#include #include #include #include #include #include #include #include #include #include #define DEST_PORT 80 #define DEST_IP_ADDR "10.0.9.139" #define DEST_IP_BY_NAME "demo.git.com" void process_info(int fd) { int send_num; char send_buf [] = "helloworld"; char recv_buf [4096]; char str1[4096]; while (1) { printf("begin send "); memset(str1,0,4096); strcat(str1, "POST http://demo.git.com/sum.php HTTP/1.1 "); strcat(str1,"Host: demo.git.com "); strcat(str1,"Content-Length: 65 "); strcat(str1,"Content-Type: application/x-www-form-urlencoded "); strcat(str1," "); strcat(str1,"mathod=adb_signe&token=0E1FEECD0EE54E3B8568A536A7036D78B1AC7EEE"); strcat(str1," "); printf("str1 = %s ",str1); send_num = send(fd, str1,strlen(str1),0); if (send_num < 0) { perror("send error"); exit(1); } else { printf("send successful "); printf("begin recv: "); int recv_num = recv(fd,recv_buf,sizeof(recv_buf),0); if(recv_num < 0){ perror("recv"); exit(1); } else { printf("recv sucess:%s ",recv_buf); } } break; sleep(5); } } int main() { int sock_fd; struct sockaddr_in addr_serv; sock_fd=socket(AF_INET, SOCK_STREAM, 0); if (sock_fd < 0) { perror("sock error"); exit(1); } else { printf("sock successful"); } struct hostent* hostInfo = gethostbyname(DEST_IP_BY_NAME); if(NULL == hostInfo){ printf("hostInfo is null "); return -6; } memset(&addr_serv, 0, sizeof(addr_serv)); addr_serv.sin_family = AF_INET; addr_serv.sin_port = htons(DEST_PORT); //addr_serv.sin_addr.s_addr = inet_addr(DEST_IP_ADDR); printf("Ip address = %s ",inet_ntoa(*((struct in_addr*)hostInfo->h_addr))); memcpy(&addr_serv.sin_addr, &(*hostInfo->h_addr_list[0]), hostInfo->h_length); if (connect(sock_fd, (struct sockaddr*)(&addr_serv), sizeof(addr_serv)) < 0) { perror("connect error "); exit(1); } else { printf("connect successful "); } process_info(sock_fd); }

总结

  • 需要使用c语言发送http的请求,关键点在构建http的格式,在这个过程中,通过尝试发现在strcat后,每次都需要使用 进行分割。没有进行分割的时候,返回了400错误。 这个 具体该写不该写,需要具体问题具体分析,多多尝试。
  • 在linux c 的编程中。通常使用的是ip地址,例如 10.0.9.139 这样的地址。如果服务提供的是域名,这是就需要将域名利用gethostbyname进行转换。

参考文献

Linux下用c语言实现发送http请求 方式可以Get或者Post
C socket 发送HTTP请求