`

简单的linux -c http-client

阅读更多
#include<stdio.h>
#include <unistd.h>
#include<fcntl.h>
#include<netdb.h>
#include<stdlib.h>
#include "httpclient.h"
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <netinet/in.h>

const char * http_s = "http://";

typedef struct{

char *url;
int port;
char *host;
char *anyurl;
int isip;

}Hostinfo;

int isip(const char * s){

         while( *s ){
                 if(isalpha(*s) && *s != '.')
                  {
                         return 0;
                  }     
                  s++;  
         }       
        
         return 1;
        
}

int gethostinfobyurl(const char * url, char ** host, int *port, char ** anyurl)
{

if(url == NULL || 0!=strncmp(url, http_s, strlen(http_s)) ){

printf("url is not legal, %s\n", url);

return -1;
}


char * h_url = strstr(url,"//");

h_url = h_url + 2;

*anyurl= strchr(h_url,'/');

printf("hurl: %s\n",h_url);
if(anyurl != NULL){

char cc[1024];
char *pcc = cc;
strcpy(cc,h_url);
h_url = strsep(&pcc,"/");
printf("hhurl:%s\n",h_url);
}

if(NULL !=strchr(h_url,':')){

*host = strsep(&h_url,":");
char *cport = strsep(&h_url,":");
*port = atoi(cport);
}
else{

*host = h_url;
}
return 0;
}

void datas(int fp,Hostinfo *hinfo){

char request[1024];
bzero(&request,1024);
//sprintf(request,"GET %s  HTTP/1.1\r\nHost:  61.135.169.125:80\r\nConnection:   Close\r\n\r\n","/");
sprintf(request,   "GET   %s   HTTP/1.1\r\nAccept:   */*\r\nAccept-Language:   zh-cn\r\n\
Host:  %s:%d\r\nConnection:   Close\r\n\r\n ", hinfo->anyurl,hinfo->host,hinfo->port);

printf("\n\n");
printf("%s",request);

printf("\n\n");

printf("request is %s\n", request);
int send = write(fp, request,strlen(request));

if(send == -1){

printf("send error\n");
exit(1);
}


printf("send num: %d\n", send);
int BUFFER_SIZE = 2048;
char buffer[BUFFER_SIZE];
int length;
bzero(&buffer, BUFFER_SIZE);

        length = read(fp,buffer,BUFFER_SIZE);
char * content = buffer;


if(length <=0){

printf("error! read http return content!");

//return NULL;
}
char * head = strsep(&content,"\r\n");
printf("head:%s\n",head);

strsep(&head," ");

printf("1-->>head:%s\n",head);
if(head == NULL){


printf("error! read http return content!");
return;
}


head = strsep(&head," ");

printf("2-->>head:%s\n",head);
int result = atoi(head);

if(result == 200){
printf("success\n");

}

/*while( length = read(fp,buffer,BUFFER_SIZE)){
if(length <=0){
return ;
}
bzero(&buffer,1024);
}

*/



}
int connect_http(Hostinfo * hinfo)
{
int cfd;
struct sockaddr_in s_add;
        struct sockaddr_in * sinp;
struct addrinfo hint;
struct addrinfo *ailist, *aip;
int i = 0, err;
char seraddr[128];

printf(" hinfo->host: %s\n", hinfo->host);
  if(!(hinfo -> isip)){

  hint.ai_family = AF_INET;
  hint.ai_socktype = SOCK_STREAM;
  hint.ai_flags = AI_CANONNAME;
  hint.ai_protocol = 0;
  hint.ai_addrlen = 0;
  hint.ai_addr = NULL;
  hint.ai_canonname = NULL;
  hint.ai_next = NULL;
char name[1024];
strcpy(name, hinfo->host);
      if ((err = getaddrinfo(name, NULL, &hint, &ailist)) != 0) {
          printf("getaddrinfo error: %s host :%s\n", gai_strerror(err), hinfo->host);
          exit(-1);
       }

for (aip = ailist; i==0 && aip != NULL; aip = aip->ai_next) {
 
sinp = (struct sockaddr_in *)aip->ai_addr;
//break;
         i = i+1;

if (inet_ntop(sinp->sin_family, &sinp->sin_addr, seraddr, INET_ADDRSTRLEN) != NULL)
               {
                    printf("\nserver address is %s\n", seraddr);
               }



  }
}
else{

strcpy(seraddr,hinfo->host);
}
cfd = socket(AF_INET,SOCK_STREAM,0);
if(cfd == -1){
printf("socket error\n");
return -1;
}

struct timeval timeo = {3, 0};
socklen_t len = sizeof(timeo);
setsockopt(cfd, SOL_SOCKET, SO_SNDTIMEO, &timeo, len);
bzero(&s_add, sizeof(struct sockaddr_in));
s_add.sin_family=AF_INET; 
s_add.sin_addr.s_addr= inet_addr(seraddr);  
s_add.sin_port=htons(hinfo->port);

if(-1 == connect(cfd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr))) 

    printf("connect fail !\r\n"); 
    return -1; 

  // int flags = fcntl(cfd, F_GETFL, 0);                       //设置异步
       //fcntl(cfd, F_SETFL, flags | O_NONBLOCK); 
printf("connect ok !\r\n");
datas(cfd,hinfo);
close(cfd);
return 1;

}

char *  get(const char * url)
{
char * host = (char *)malloc(200);
char * curl = (char *)malloc(200);
int port = 80;
int *cport = &port;
int result = gethostinfobyurl(url,&host,cport,&curl);

if(result < 0){
return NULL;
}

printf("parase host:%s\n",host);
Hostinfo *hinfo = (Hostinfo*)calloc(1,sizeof(Hostinfo));

hinfo->port = port;
hinfo->host = host;
hinfo->anyurl = curl;
hinfo->isip = isip(hinfo->host);
connect_http(hinfo);
return NULL;
}


int main()
{
const char * url = "http://61.135.169.105:80/";
/* char * host = (char *)malloc(200);
char * curl = (char *)malloc(200);
int port = 80;
int *cport = &port;
gethostinfobyurl(url,&host,cport,&curl);
printf("host:%s \t address: %s\n",host,curl);
printf("port : %d\n",port);
*/
get(url);
return 0;

}





分享到:
评论

相关推荐

    kubernetes-client-linux-amd64.tar.gz资源包,可使用

    `kubernetes-client-linux-amd64.tar.gz` 是一个针对Linux AMD64架构的Kubernetes客户端工具包,它包含了与Kubernetes集群交互所需的命令行工具。这个资源包主要用于开发、运维人员在Linux环境下远程操作和管理...

    Linux-socket-TCP-ClientServer.zip_TCP socket_linux socket_linux

    本教程将探讨如何在Linux环境下使用C语言编写TCP socket的客户端和服务器程序。TCP是一种面向连接的、可靠的传输协议,它确保了数据包按顺序发送且无丢失。 首先,我们来理解TCP套接字的基本概念。套接字是进程间的...

    jre-7u5-linux-i586.tar.gz

    tar zxvf jre-7u5-linux-i586.tar.gz -C ../software/ cd ../software cp -rp jre1.7.0_05/ /usr/local/ vi /etc/profile 加入如下3条 JAVA_HOME=/usr/local/jre1.7.0_05/ CLASSPATH=$CLASSPATH:$JAVA_HOME/lib PATH...

    linux-FTP客户端(纯C代码)

    本文将深入探讨如何使用纯C语言编写一个简单的FTP客户端,实现基本的上传和下载功能,但不涉及断点续传机制。 FTP客户端的核心是通过TCP连接与FTP服务器建立会话,执行一系列控制命令来完成文件的传输。以下是一些...

    OracleClient-19C Oracle客户端,包括windows和Linux

    总的来说,OracleClient-19C是Oracle数据库用户的重要工具,无论是在Windows还是Linux环境下,它都能提供高效、稳定的数据访问能力,支持各种应用程序与Oracle数据库的无缝对接。通过深入理解并熟练掌握Oracle ...

    linux--i2c.rar_ linux i2c_linux 2.6 i2c driv_linux i2c howto_li

    在Linux系统中,I2C(Inter-Integrated Circuit)是一种串行通信协议,常用于连接微控制器和其他设备,如传感器、显示驱动器等。在"linux--i2c.rar"这个压缩包中,包含了关于Linux I2C子系统的详细资料,特别是针对...

    rtsp.rar_C rtsp client_Simple RTSP_linux RTSP client_rtsp clien

    在本项目“rtsp.rar”中,我们关注的是一个简单的Linux RTSP客户端实现,它可能是一个C语言编写的程序,帮助用户与RTSP服务器进行交互,获取并播放实时的音频或视频流。 在Linux操作系统环境下,开发RTSP客户端需要...

    instantclient-basic-windows.x64-11.2.0.4.0 oracle数据库轻量化客户端工具.zip

    1. 解压下载的“instantclient-basic-windows.x64-11.2.0.4.0.zip”文件到一个指定的目录,比如"C:\Oracle\InstantClient_11_2"。 2. 配置环境变量,添加PATH到刚才解压的目录,使系统能够找到所需的动态链接库。 3....

    linux下 构造HTTP client

    下面将详细阐述如何在Linux下使用C语言实现一个简单的HTTP客户端。 首先,你需要理解HTTP的基本工作原理。HTTP协议基于TCP/IP协议,它定义了客户端和服务器之间数据交换的格式和规则。HTTP请求通常由请求行、请求头...

    oracle-instantclient-11.2客户端

    在本案例中,我们讨论的是"oracle-instant-client-11.2"客户端,这是一个适用于Linux操作系统的版本,特别用于支持Python的cx_Oracle库的安装和使用。 首先,Oracle Instant Client包含了一系列动态链接库(DLLs)...

    Sample-TCP-Server-Client.rar_linux client server_linux tcp clien

    本示例提供的"Sample-TCP-Server-Client.rar"是一个简单的TCP服务器和客户端的实现,适用于Linux环境。通过分析其中的"server.c"和"client.c"源代码,我们可以深入理解TCP通信的基础和实现。 首先,TCP是一种面向...

    Linux-C-chatroom:运行在Linux系统平台,基于TCPIP的聊天室程序

    Linux-C-聊天室 运行在Linux系统平台,基于TCP/IP的聊天室程序 首先是系统目录(用户.db为系统为每个登录用户创建的数据库文件,chat.db为聊天记录,client server为用户端和服务器端) 先看功能,再看主要代码分析 ...

    随笔-linux下安装oracle 12c client

    Linux 下安装 Oracle 12c 客户端详细教程 Oracle 12c 客户端是 Oracle 公司推出的数据库客户端软件,为用户提供了强大且灵活的数据库管理功能。然而,对于初学者来说,安装 Oracle 12c 客户端可能会是一件困难的...

    linux下C语言实现https请求源码

    在Linux环境下,使用C语言实现HTTPS(HTTP over SSL/TLS)请求是一项常见的任务,尤其对于系统编程和网络编程的学习者来说。HTTPS协议提供了安全的数据传输,确保了客户端和服务器之间的通信不被中间人攻击。本篇...

    linux-transmit-file.rar_UNIX_file linux_unix file

    5. **自编译程序**:描述中提到的“file_server.c”和“file_client.c”是C语言的源代码文件。使用`gcc`或`clang`编译器,通过`gcc file_server.c -o file_server`和`gcc file_client.c -o file_client`命令可编译为...

    sipclient_linuxc商用版本_sip协议_源码

    总的来说,"sipclient_linuxc商用版本_sip协议_源码"提供了一个在ARM Linux嵌入式平台上运行的SIP客户端实例,这对于开发者研究和学习SIP协议的实现以及嵌入式系统的应用开发具有很高的价值。通过深入理解源码,我们...

    PyPI 官网下载 | arvados-python-client-0.1.1400702097.1b3750c.tar.gz

    “arvados-python-client-0.1.1400702097.1b3750c.tar.gz”是这个库的特定版本,从其命名规则可以看出,它是一个版本号为0.1.1400702097,带有修订标识1b3750c的归档文件,格式为tar.gz,这是一种常见的Linux/Unix...

    gattclient:一个基于bluez堆栈的gatt客户端-仅使用套接字

    我知道了,这是清单att.c和att.h att-types.h bluetooth.c和bluetooth.h btgatt-client.c(主要) 配置文件crypto.c和crypto.h gatt-client.c和gatt-client.h gatt-db.c和gatt-db.h gatt-helpers.c和gatt-he

    linux socket server client实现

    本教程将深入探讨如何在Linux环境下实现一个简单的Socket服务器和客户端。 ### 一、Socket基础知识 1. **套接字(Socket)定义**:Socket是网络编程中的接口,它为应用程序提供了访问传输层服务的方法。在Linux中...

    instantclient12.2

    "整个简单的你懂的"可能是指安装和配置Oracle Instant Client相对简单,只需要下载必要的组件并设置环境变量即可。"搬运不易谢"可能是在提醒用户这些资源的获取可能有些困难,同时也表达了一种分享精神。描述中的"我...

Global site tag (gtag.js) - Google Analytics