EasyDarwin 사용 인터페이스 - 대화가 C ++ 클라이언트 서버 구현과 EasyDarwin 작성

    EasyDarwin는 클라이언트와의 상호 작용을 달성하기 위해 사용하는 고객을위한 인터페이스를 제공합니다. 예를 들어, 다음과 같이 EasyDarwin 인터페이스 문서 버전 8.1.0에있어서, 플러그 유동은 인터페이스의리스트를 획득 :

 

    우리는 위의 인터페이스를 테스트 할 수 있습니다. 먼저 "를 입력 (예 : QQ 브라우저 등) 브라우저 시작 EasyDarwin 서버를 시작 http://127.0.0.1:10008/api/v1/pushers을 (형식" '미디어 서버 컴퓨터의 IP 스트리밍': ' easydarwin.ini HTTP '+'인터페이스 메시지 ')에서 포트 번호 설정, 브라우저 표시를 다음과 같은 정보를 볼 수를 입력하고 Enter 키를 누릅니다. 더 푸시 스트림이 없기 때문에, 다음에 표시되는 정보는, 총 0 행 아니다. 이러한 응답 메시지가 브라우저 EasyDarwin 서버가 'API / V1 / 푸셔 "메시지가 반환됩니다 수신에 전송됩니다 보여줍니다. 우리는이 인터페이스는 정상입니다 볼 수 있습니다.

우리 옆에있는 인터페이스를 기반으로 C ++ 클라이언트를 작성하기 위해, 예를 들어 플러그 흐름의 목록을 얻을. 새로운 콘솔 프로그램은 vs2015에서 다음 코드를 입력합니다. 참조 코드 " 간단한의 C ++ 구현 HTTP GET 및 POST 클래스를 요청 "

HttpRequest.h

#pragma once
#include <string>
#include <vector>

class HttpRequest
{
public:
	HttpRequest(const std::string& ip, int port);
	~HttpRequest(void);
	std::string HttpGet(std::string req);  //进行Http的GET请求
private:
	std::string m_ip;   //需要连接的http服务器的IP
	int m_port;         //需要连接的http服务器的端口号
};

 

HttpRequest.cpp

#include "HttpRequest.h"
#include <WinSock.h>
#include <iostream>

#pragma comment(lib, "ws2_32.lib")

HttpRequest::HttpRequest(const std::string& ip, int port) : m_ip(ip), m_port(port)
{
}


HttpRequest::~HttpRequest(void)
{
}

//进行Http的GET请求
std::string HttpRequest::HttpGet(std::string req)
{
	std::string ret = "";     //返回Http的Response(响应)
	try
	{
		/*进行socket初始化*/
		WSADATA wData;
		::WSAStartup(MAKEWORD(2, 2), &wData);

		SOCKET clientSocket = socket(AF_INET, 1, 0);
		struct sockaddr_in ServerAddr = { 0 };
		ServerAddr.sin_addr.s_addr = inet_addr(m_ip.c_str());
		ServerAddr.sin_port = htons(m_port);
		ServerAddr.sin_family = AF_INET;
		int errNo = connect(clientSocket, (sockaddr *)&ServerAddr, sizeof(ServerAddr));  //连接服务器
		if (0 == errNo)                            //如果成功连接上服务器
		{
			std::string strSend = " HTTP/1.1\r\n"
				"Host: 192.168.1.104:10008\r\n"
				"Connection: keep-alive\r\n"
				"Cache-Control: max-age=0\r\n"
				"Upgrade-Insecure-Requests: 1\r\n"
				"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3732.400 QQBrowser/10.5.3819.400\r\n"
				"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n"
				"Accept-Encoding: gzip, deflate\r\n"
				"Accept-Language: zh-CN,zh;q=0.9\r\n"
				"Cookie: token=42C0EN0ZR\r\n\r\n";

			strSend = "GET " + req + strSend;

			errNo = send(clientSocket, strSend.c_str(), strSend.length(), 0);   //发送缓冲区strSend中的信息给服务器
			if (errNo > 0)
			{
				std::cout << "发送成功" << std::endl;
			}
			else
			{
				std::cout << "发送失败" << std::endl;
				//std::cout << "errNo:" << errNo << std::endl;
				return ret;
			}

			int buf_size = 5000;
			char *bufRecv = new char[buf_size]();   //申请buf_size大小的空间并初始化为0,将指针bufRecv指向该空间
			errNo = recv(clientSocket, bufRecv, buf_size, 0);
			if (errNo > 0)           // 如果接收响应成功,则返回接收的数据内容
			{
				ret = bufRecv;        
				delete[] bufRecv;
			}
			else                     //如果接收响应失败
			{
				std::cout << "接收失败" << std::endl;
				delete[] bufRecv;
				//std::cout << "errNo:" << errNo << std::endl;
				return ret;
			}
		}
		else        //如果连接不上服务器
		{
			errNo = WSAGetLastError();
			std::cout << "errNo:" << errNo << std::endl;
		}
		// socket环境清理
		::WSACleanup();
	}
	catch (...)
	{
		return "";
	}
	return ret;
}

 

MAIN.CPP

#include "HttpRequest.h"
#include <iostream>
#include <Windows.h>

int main(int argc, char *argv[])
{
	HttpRequest httpReq("127.0.0.1", 10008);
	std::string res = httpReq.HttpGet("/api/v1/pushers");
	std::cout << res << std::endl;
	return 0;
}

 

실행, 코드 완성을 입력 컴파일 한 후, 당신은으로 다음되는 콘솔 출력은 클라이언트의 목록을 얻는 것을 증명 볼 수 있습니다 성공 EasyDarwin를 플러그인을 흐른다.

 

클라이언트 만 메시지는 서버가 성공적으로 응답을받을 수 없습니다에 "/ API / V1 / 푸셔 가져 오기", 및 HTTP 헤더를 전송해야한다면 여기서 우리는 문제를주의해야합니다. 캡처에 의해 전송 된 데이터를 사용하여 Wireshark와 클라이언트가 데이터 전송은 다음과 같이 볼 수있다, 또한 다른 많은 것들을 만들어, "GET / API / V1 / 푸시 버튼"을 추가하여 볼 수 있습니다.

 

发布了54 篇原创文章 · 获赞 55 · 访问量 12万+

추천

출처blog.csdn.net/u014552102/article/details/102826521