2015-11-02 17:58:49 zhouyongku 阅读数 1320
  • C++socket网络编程--http服务器(支持php)实战教学视频

    C++socket网络编程大全实战http服务器(支持php)视频培训教程概况:本课程会同时演示在linux和windows中的编程,课程中的线程和正则表达式都使用c++提供库。本课程包含了socket网络编程常用的所有特性,包括tcp、udp协议的基础编程,广播包,超时连接,多路复用,高并发的epoll多路复用,多线程的服务端。课程讲解理论与实践相结合,实践以代码延时讲解为主。

    22666 人正在学习 去看看 夏曹俊

一.安装libcurl

http://www.execve.net/curl/curl-7.45.0.tar.gz

二.解压编译

./configure --prefix=/opt/libcurl/
 make
 make install

三.链接

makefile中 增加-lcurl

四.代码

#ifndef __HTTP_CLIENT_H__
#define __HTTP_CLIENT_H__


#include "curl/curl.h"  

void HttpGet( const char *url );


#ifndef __HTTP_CURL_H__
#define __HTTP_CURL_H__

#include <string>

class CHttpClient
{
public:
	CHttpClient(void);
	~CHttpClient(void);

public:
	/**
	* @brief HTTP POST请求
	* @param strUrl 输入参数,请求的Url地址,如:http://www.baidu.com
	* @param strPost 输入参数,使用如下格式para1=val1?2=val2&…
	* @param strResponse 输出参数,返回的内容
	* @return 返回是否Post成功
	*/
	int Post(const std::string & strUrl, const std::string & strPost, std::string & strResponse);

	/**
	* @brief HTTP GET请求
	* @param strUrl 输入参数,请求的Url地址,如:http://www.baidu.com
	* @param strResponse 输出参数,返回的内容
	* @return 返回是否Post成功
	*/
	int Get(const std::string & strUrl, std::string & strResponse);

	/**
	* @brief HTTPS POST请求,无证书版本
	* @param strUrl 输入参数,请求的Url地址,如:https://www.alipay.com
	* @param strPost 输入参数,使用如下格式para1=val1?2=val2&…
	* @param strResponse 输出参数,返回的内容
	* @param pCaPath 输入参数,为CA证书的路径.如果输入为NULL,则不验证服务器端证书的有效性.
	* @return 返回是否Post成功
	*/
	int Posts(const std::string & strUrl, const std::string & strPost, std::string & strResponse, const char * pCaPath = NULL);

	/**
	* @brief HTTPS GET请求,无证书版本
	* @param strUrl 输入参数,请求的Url地址,如:https://www.alipay.com
	* @param strResponse 输出参数,返回的内容
	* @param pCaPath 输入参数,为CA证书的路径.如果输入为NULL,则不验证服务器端证书的有效性.
	* @return 返回是否Post成功
	*/
	int Gets(const std::string & strUrl, std::string & strResponse, const char * pCaPath = NULL);

public:
	void SetDebug(bool bDebug);

private:
	bool m_bDebug;
};

#endif


 

#include "HttpClient.h"

void ParaseUrl( const char * url,char *szIP,int &nPort )
{
	sprintf( szIP,"219.146.59.6");
	nPort = 38000;

}

void HttpGet(const char * url)
{

	char szUrl[ MAX_HTTP_REQUEST_URL_LEN ] = { 0 };
	char szIP[ MAX_WMS_STR_LEN ] = { 0 };
	int	 nPort = 0;
	std::string strContent="GET /MONITOR_WEB/getShipPosition?v=1&k=1F6D701272402D1E7D8D316CCE519123&enc=1&cmd=2003&id=412326936&idtype=0 HTTP/1.1\r\n";
				strContent += "Accept: text/html, application/xhtml+xml, */*\r\n";
				strContent += "Accept-Language: zh-CN\r\n";
				strContent += "User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)\r\n";
				strContent += "Accept-Encoding: gzip, deflate\r\n";
				strContent += "Host: 219.146.59.6:38000\r\n";
				strContent += "DNT: 1\r\n";
				strContent += "Connection: Keep-Alive\r\n";

	
	ParaseUrl( url,szIP,nPort );
	
	int nSocket = socket(AF_INET,SOCK_STREAM,0);

	if( nSocket < 0 )	

	{
		printf("###########################HttpGet failed of create socket!###########################\n");

		return;

	}

	struct timeval timeout={1,0};//1s
    setsockopt(nSocket,SOL_SOCKET,SO_SNDTIMEO,(const char*)&timeout,sizeof(timeout));

    setsockopt(nSocket,SOL_SOCKET,SO_RCVTIMEO,(const char*)&timeout,sizeof(timeout));

	
	struct sockaddr_in server;
	memset(&server,0,sizeof(server));
	server.sin_family			= AF_INET;
	server.sin_port				= htons(nPort);

	server.sin_addr.s_addr    	=  inet_addr(szIP);;

	if ( connect(nSocket, (struct sockaddr *)&server, sizeof(server)) < 0 )	

	{
		close(nSocket);

		printf("###########################HttpGet failed of connect server ip=%s port=%d!###########################\n",szIP,nPort);

		return ;

	}
	printf("HttpGet  success!\n");

	send( nSocket,strContent.c_str(),strContent.size(),0 );
	
	int nSize = recv(nSocket,szUrl,MAX_HTTP_REQUEST_URL_LEN,0);
	printf( szUrl );
	
	close(nSocket );
}


CHttpClient::CHttpClient(void) : 
m_bDebug(false)
{

}

CHttpClient::~CHttpClient(void)
{

}

static int OnDebug(CURL *, curl_infotype itype, char * pData, size_t size, void *)
{
	if(itype == CURLINFO_TEXT)
	{
		//printf("[TEXT]%s\n", pData);
	}
	else if(itype == CURLINFO_HEADER_IN)
	{
		printf("[HEADER_IN]%s\n", pData);
	}
	else if(itype == CURLINFO_HEADER_OUT)
	{
		printf("[HEADER_OUT]%s\n", pData);
	}
	else if(itype == CURLINFO_DATA_IN)
	{
		printf("[DATA_IN]%s\n", pData);
	}
	else if(itype == CURLINFO_DATA_OUT)
	{
		printf("[DATA_OUT]%s\n", pData);
	}
	return 0;
}

static size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid)
{
	std::string* str = dynamic_cast<std::string*>((std::string *)lpVoid);
	if( NULL == str || NULL == buffer )
	{
		return -1;
	}

    char* pData = (char*)buffer;
    str->append(pData, size * nmemb);
	return nmemb;
}

int CHttpClient::Post(const std::string & strUrl, const std::string & strPost, std::string & strResponse)
{
	CURLcode res;
	CURL* curl = curl_easy_init();
	if(NULL == curl)
	{
		return CURLE_FAILED_INIT;
	}
	if(m_bDebug)
	{
		curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
		curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);
	}
	curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
	curl_easy_setopt(curl, CURLOPT_POST, 1);
	curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strPost.c_str());
	curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
	curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);
	curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
	curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);
	curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);
	res = curl_easy_perform(curl);
	curl_easy_cleanup(curl);
	return res;
}

int CHttpClient::Get(const std::string & strUrl, std::string & strResponse)
{
	CURLcode res;
	CURL* curl = curl_easy_init();
	if(NULL == curl)
	{
		return CURLE_FAILED_INIT;
	}
	if(m_bDebug)
	{
		curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
		curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);
	}
	curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
	curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
	curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);
	/**
	* 当多个线程都使用超时处理的时候,同时主线程中有sleep或是wait等操作。
	* 如果不设置这个选项,libcurl将会发信号打断这个wait从而导致程序退出。
	*/
	curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
	curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);
	curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);
	res = curl_easy_perform(curl);
	curl_easy_cleanup(curl);
	return res;
}

int CHttpClient::Posts(const std::string & strUrl, const std::string & strPost, std::string & strResponse, const char * pCaPath)
{
	CURLcode res;
	CURL* curl = curl_easy_init();
	if(NULL == curl)
	{
		return CURLE_FAILED_INIT;
	}
	if(m_bDebug)
	{
		curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
		curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);
	}
	curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
	curl_easy_setopt(curl, CURLOPT_POST, 1);
	curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strPost.c_str());
	curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
	curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);
	curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
	if(NULL == pCaPath)
	{
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
	}
	else
	{
		//缺省情况就是PEM,所以无需设置,另外支持DER
		//curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM");
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);
		curl_easy_setopt(curl, CURLOPT_CAINFO, pCaPath);
	}
	curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);
	curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);
	res = curl_easy_perform(curl);
	curl_easy_cleanup(curl);
	return res;
}

int CHttpClient::Gets(const std::string & strUrl, std::string & strResponse, const char * pCaPath)
{
	CURLcode res;
	CURL* curl = curl_easy_init();
	if(NULL == curl)
	{
		return CURLE_FAILED_INIT;
	}
	if(m_bDebug)
	{
		curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
		curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);
	}
	curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
	curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
	curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);
	curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
	if(NULL == pCaPath)
	{
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
	}
	else
	{
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);
		curl_easy_setopt(curl, CURLOPT_CAINFO, pCaPath);
	}
	curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);
	curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);
	res = curl_easy_perform(curl);
	curl_easy_cleanup(curl);
	return res;
}

///////////////////////////////////////////////////////////////////////////////////////////////

void CHttpClient::SetDebug(bool bDebug)
{
	m_bDebug = bDebug;
}




 

参考文章:http://blog.csdn.net/huyiyang2010/article/details/7664201

2010-07-17 09:38:00 HistoricalMemory 阅读数 1177
  • C++socket网络编程--http服务器(支持php)实战教学视频

    C++socket网络编程大全实战http服务器(支持php)视频培训教程概况:本课程会同时演示在linux和windows中的编程,课程中的线程和正则表达式都使用c++提供库。本课程包含了socket网络编程常用的所有特性,包括tcp、udp协议的基础编程,广播包,超时连接,多路复用,高并发的epoll多路复用,多线程的服务端。课程讲解理论与实践相结合,实践以代码延时讲解为主。

    22666 人正在学习 去看看 夏曹俊

    

      在使用Windows操作系统时,NTFS做为最常用的分区格式存在,但是因为这个格式在Linux下默认不能直接使用,所以Linux用户不能充分利用NTFS格式的硬盘空间,因为Linux没有将挂载NTFS格式这项功能编译到内核里面,所以用户必须重新编译内核;但是编译过程比较复杂又很难保证一定能够挂载NTFS分区,下面介绍一种最简单有效的方法让Linux支持挂载NTFS分区

(以CentOS 5.5为例,今天已经亲自测试成功,CentOS 4.8下测试失败)

一.下载所需源码

fuse最新版本官网下载地址:http://sourceforge.net/projects/fuse/files/fuse-2.X/2.8.3/fuse-2.8.3.tar.gz/download

ntfs-3g最新版本官网下载地址:http://tuxera.com/opensource/ntfs-3g-2010.3.6.tgz

二.安装源码

建议安装前阅读Install redem文档里面有详细的安装方法和参数说明。

1.安装fuse

[root@localhost ~]#tar –zxvf fuse-2.8.3.tar.gz
[root@localhost ~]#cd fuse-2.8.3
[root@localhost ~]#./configure
[root@localhost ~]#make && make install
[root@localhost ~]#modprobe fuse

2.安装ntfs-3g

[root@localhost ~]#tar –zxvf ntfs-3g-2010.3.6.tgz
[root@localhost ~]#cd ntfs-3g-2010.3.6
[root@localhost ~]#./configure
[root@localhost ~]#make && make install 
三.挂载NTFS分区

查看NTFS分区位置

[root@localhost ~]#fdisk –l

 

挂载NTFS分区

[root@localhost ~]#mkdir /mnt/windows

[root@localhost ~]#mount –t ntfs-3g /dev/had?(?代表你要挂的NTFS分区,数字为fdisk -l寻找) /mnt/windows

现在已经能完美实现对NTFS分区进行读写的操作了.

2010-08-03 14:32:00 cyberhero 阅读数 2463
  • C++socket网络编程--http服务器(支持php)实战教学视频

    C++socket网络编程大全实战http服务器(支持php)视频培训教程概况:本课程会同时演示在linux和windows中的编程,课程中的线程和正则表达式都使用c++提供库。本课程包含了socket网络编程常用的所有特性,包括tcp、udp协议的基础编程,广播包,超时连接,多路复用,高并发的epoll多路复用,多线程的服务端。课程讲解理论与实践相结合,实践以代码延时讲解为主。

    22666 人正在学习 去看看 夏曹俊

以前写过win32下面简单的sniff, 今天突然试试在linux下抓取http包。发现linux下与win32下有很大的不同点。

下面简单总结一下:

1.win下必须wsastartup,Linux直接使用

2.win下不需要指定对某个网卡进行监控,linux下须指定你想要用到的网站名称

3.win下使用ioctlsocket把网卡设置成混杂模式,而linux下则通过ioctl函数设置

4.虽然我们收到的包就是RAW形式的,但在win下面是从ip层开始,Linux是从ether层开始的。

好了,帖出我实验中的源码:

 

 

 

2016-05-05 14:29:01 kakadanica 阅读数 144
  • C++socket网络编程--http服务器(支持php)实战教学视频

    C++socket网络编程大全实战http服务器(支持php)视频培训教程概况:本课程会同时演示在linux和windows中的编程,课程中的线程和正则表达式都使用c++提供库。本课程包含了socket网络编程常用的所有特性,包括tcp、udp协议的基础编程,广播包,超时连接,多路复用,高并发的epoll多路复用,多线程的服务端。课程讲解理论与实践相结合,实践以代码延时讲解为主。

    22666 人正在学习 去看看 夏曹俊

在http://httpd.apache.org/下载apache,我下载的是httpd-2.2.31.tar.gz

使用SecureFx连接linux服务器,将下载的httpd-2.2.31.tar.gz上传到local目录下

使用secureCRT连接linux服务器,到local目录下

[root@local]# ls    //你将会看到你上传的httpd-2.2.31.tar.gz
[root@local]# tar –zxvf  httpd-2.2.31.tar.gz // 解压httpd-2.2.31.tar.gz后为httpd-2.2.31
[root@local]# mkdir /usr/local/web/apache/   //在这个目录下建立文档,利于管理        
[root@local]# cd  httpd-2.2.31  
[root@httpd-2.2.9]#./configure  --prefix=/usr/local/web/apache --enable-shared=max --enable-module=rewirte --enable-module=so       
[root@httpd-2.2.9]# make  //编译  
[root@httpd-2.2.9]# make install //安装  

安装成功之后,使用SecureFx进入apache的安装目录( /usr/local/web/apache/ ),打开bin目录,使用文本编辑httpd.conf文件

找到“#ServerName www.example.com:80”,将本行的#去掉

[root@httpd-2.2.9]# cd ../web/apache/bin  //进入apache的安装的bin目录
[root@bin]# ./apachectl start //启动Apache

如果出现端口被占用的错误,解决方法如下:

1.在httpd.conf文本中找到“Listen 80”,修改80为其它端口号

2. [root@local]# netstat -tlnp | grep 80 //查看80端口使用进程
    [root@local]# pkill 使用80端口的进程ID或者名字 //结束所有使用80端口的进程

    [root@httpd-2.2.9]# cd web/apache/bin  //进入apache的安装的bin目录

    [root@bin]# ./apachectl restart //重启Apache

查看apche是否安装成功的方法:在浏览器中输入http://linux服务器ip:apache端口 回车,出现“It works”表示安装成功

将web静态页面部署到apache下

使用secureFx进入Apache安装目录 /usr/local/web/apache/ ),打开htdocs

将web静态页面上传在此目录下,重启apache即可。


没有更多推荐了,返回首页