文档章节

C++ HTTP 客户端

LivonYang
 LivonYang
发布于 2015/01/13 10:27
字数 682
阅读 74
收藏 1


2015.01.13

// ConsoleApplication2_HttpClient.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <string.h>


/*
* 客户端
*/

#include<Winsock2.h>   
#include<stdio.h>   
#pragma comment(lib,"Ws2_32.lib")











int main2(){
	
    SOCKET      sSocket      = INVALID_SOCKET;
    SOCKADDR_IN stSvrAddrIn = {0}; /* 服务器端地址 */
    char        sndBuf[1024] = {0};
    char        rcvBuf[2048] = {0};
    char       *pRcv         = rcvBuf;
    int         num          = 0;
    int         nRet         = SOCKET_ERROR;

	int         nSend         = NULL ;
 
    WSADATA     wsaData;
 
    /* HTTP 消息构造开始,这是程序的关键之处 */
    sprintf( sndBuf, "POST / HTTP/1.1\n");
    strcat( sndBuf, "Host: localhost\n");
    strcat( sndBuf, "Path: trafficSynchronization/gps/sendTest.jsp\n\r\n");
	//strcat( sndBuf, "Host: localhost\n\r\n");
	//strcat( sndBuf, "Host: localhost/n/r/n");
    /* HTTP 消息构造结束 */
	
    /* 发送内容 */
    printf("\nsndBuf = %s\n", sndBuf);
      
    /* socket DLL初始化 */
    WSAStartup(MAKEWORD(2, 0), &wsaData);
 
    stSvrAddrIn.sin_family      = AF_INET;
    stSvrAddrIn.sin_port        = htons(8080);
    // stSvrAddrIn.sin_addr.s_addr = inet_addr("202.108.9.51");
    // stSvrAddrIn.sin_addr.s_addr = inet_addr("60.207.246.98");
	// stSvrAddrIn.sin_addr.s_addr = inet_addr("192.168.100.1");
	stSvrAddrIn.sin_addr.s_addr = inet_addr("192.168.1.133");
	// stSvrAddrIn.sin_addr.s_addr = inet_addr("localhost");
	// stSvrAddrIn.sin_addr.s_addr = inet_addr("217.147.180.114");



	printf("\n准备进行 socket() 连接!\n");
 
    sSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP);
	   
	if( sSocket == INVALID_SOCKET ){
		printf("\nsocket 失败!");
		printf("\n回车键继续 ...\n");
		getchar();
		return -1 ;
	}
	
	printf("\nsocket 成功!\n");
	//printf("\n回车键继续 ...\n");
	//getchar();

 
    /* 连接 */
    nRet = connect(sSocket, (SOCKADDR*)&stSvrAddrIn, sizeof(SOCKADDR));
    if ( SOCKET_ERROR == nRet )
    {
		printf("connect fail!/n");
		printf("\n回车键继续 ...\n");
		getchar();
            return -1;
    }

	/*
		Connection 成功!
	*/
	printf("\nconnect 成功!\n");
	//printf("\n回车键继续 ...\n");
	//getchar();


      
    /* 发送HTTP请求消息 */
    nSend = send(sSocket, (char*)sndBuf, sizeof(sndBuf), 0);
	   
	if( nSend == NULL || nSend <= 0 ){
		printf("\nsend 失败!");
		printf("\n回车键继续 ...\n");
		getchar();
		return -1 ;
	}

	/*
		send 成功!
	*/
	printf("\nsend 成功!\n"); 
	//printf("\n回车键继续 ...\n");
	//getchar();

 
    /* 接收HTTP响应消息 */
    // while(1)
    // {
		printf("\n.");
        num = recv(sSocket, pRcv, 2048, 0);
		printf("\nnum = %d", num );
 
        //pRcv += num;
 
        //if((0 == num) || (-1 == num))
        //    {
        //            break ;
        //    }
    // }
      
       /* 打印响应消息 */
       printf("\n%s\n", rcvBuf);
 
	/*
		显示接收信息 成功!
	*/
	printf("\n回车键继续 ...\n");
	getchar();

    return 0;

}

void main1()   
{   

  WORD   wVersionRequested;   
  WSADATA   wsaData;   
  int   err;   
  char * sendData ;


  
       char        rcvBuf[2048] = {0};
       char       *pRcv         = rcvBuf;
       int         num          = 0;
       int         nRet         = SOCKET_ERROR;


    
  wVersionRequested = MAKEWORD( 2, 2 );
    
  err = WSAStartup( wVersionRequested, &wsaData );   
  if( err != 0 ){   
     return;   
  }   
    
    
  if( LOBYTE(wsaData.wVersion) != 2 ||
      HIBYTE(wsaData.wVersion) != 2 ){   
     
      WSACleanup();   
      return;     
  }   

  /*
	socket 连接
  */
  SOCKET sockClient = WSASocket( AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED );

  SOCKADDR_IN   addrClient;   // 服务器地址信息

  addrClient.sin_addr.S_un.S_addr = inet_addr("192.168.100.1"); // 要连接的服务地址
  addrClient.sin_family = AF_INET; // 协议族  
  addrClient.sin_port = htons(80);  // 请求的端口 
    
  char  sendBuffer[1024];   // 每次发送的最大数据量
  nRet = connect( sockClient, (SOCKADDR*)&addrClient, sizeof(SOCKADDR) ); // 连接服务器端   

  if( nRet == NULL ){
	printf("\n连接失败!");
	printf("\n回车键继续 ...\n");
	getchar();
	return ;
  }

	printf("\n已连接,nRet = ");
	printf( (char*)nRet );
	printf("\n回车键继续 ...\n");
	getchar();
  
    /*send   data   to   service*/   
    //printf("Please   input   data:\n");   
	//sendData = gets(sendBuffer);
    //printf( strcat( sendData , " - Please   input   data:\n"));  

  //while(true)   
  //{   

    // printf("%s/n", sendBuffer);
	
    if( gets( sendBuffer ) == NULL)  // 输入要发送的数据 
		printf("NULL\n");  
		// break;   
    else   
    {   
      if( SOCKET_ERROR == send(sockClient,sendBuffer,
          strlen(sendBuffer)+1, 0 )) // TCP方式发送  
      {   
         printf("Transmission data defeat!\n");   
         // break;   
      } 
	  else{
		  printf( sendBuffer );
	  }
    }   
  // }   


         /* 接收HTTP响应消息 */
       while(1)
       {
			printf(".");
              num = recv(sockClient, pRcv, 2048, 0);
 
              pRcv += num;
 
           if((0 == num) || (-1 == num))
              {
                     break ;
              }
       }
      
       /* 打印响应消息 */
       printf("%s/n", rcvBuf);

	   
  closesocket( sockClient );    // 严格来说这里需要加错误检测 if(0 != closesocket(socket)){}
  WSACleanup();   

  
	printf("\n回车键退出 ...\n");
	getchar();

	return ;

}


© 著作权归作者所有

LivonYang
粉丝 0
博文 4
码字总数 917
作品 0
沈阳
私信 提问
acl redis C++ 库被 redis 官方收录

acl 库中的新增模块 redis C++ 客户端库被 redis 官方正式收录,参见 http://redis.io/clients 中的 C++ 部分,其中 “redis-client for C++” 库即为 acl redis C++ 客户端库。acl 中的 re...

郑树新
2015/03/09
8.3K
10
支持 LINUX/WIN32 平台的网络通讯及服务器框架

acl 框架库是一个 C 库,主要包含:服务器开发框架、同步/异步网络通讯、常用数据结构、进程池/线程池、流式 xml/json 解析器、http/ping 应用协议等内容; acl_cpp 是基于 acl 库的 C++ 库,...

郑树新
2012/06/03
39
0
SSDB 的 C++ 客户端接口

SSDB 本身是用 C++ 语言编写的, 所以天生就支持 C++ 客户端 API. SSDB 源码中自带的 leveldb-import.cpp, ssdb-dump.cpp 等程序, 也是 C++ 客户端的例子. 不过, 这些 API 依赖整个项目, 编译...

ideawu
2013/11/18
819
0
acl_cpp 1.1.1.2 发布,C++网络框架库

经过了长时间的测试与项目实践,acl_cpp 1.1.1.2 版本终于发布了,acl_cpp 基于 C 语言版本的 acl 框架库而写的C++库,具备如下特性: 1)同步/异步网络通信框架;同步流既支持网络通信,又支...

郑树新
2012/08/19
1K
3
Apache Qpid 0.8 发布

Apache Qpid (Open Source AMQP Messaging) 是一个跨平台的企业通讯解决方案,实现了高级消息队列协议。提供了 Java、C++ 两种服务端版本以及 Java、C++、.NET、Python和Ruby语言的客户端。 ...

红薯
2010/12/07
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
8
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
9
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
7
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部