欢迎光临
未来你我一起携手

CURL简单使用例程

Li, Json阅读(11)

curl是利用URL语法在命令行方式下工作的开源文件传输工具。它被广泛应用在Unix、多种Linux发行版中,并且有DOS和Win32、Win64下的移植版本。

官网下载地址:https://curl.haxx.se/download.html 这里有多平台支持下载。windows下也可以从这里下载[带证书]:https://winampplugins.co.uk/curl/ 亦可以使用其他版本类型的

下载后解压得到2个文件。一个crt一个exe。解压到C盘下curl文件夹。或者可以配置环境变量。这样的话就可以随时随地的调用。不需要切换到指定文件夹了

CURL环境变量

CURL环境变量

我们输入–help就可以看到很多参数了。也许会花上很多时间。但是现在。我们用最简单的方法来进行一次请求。我们要用到的是审查元素

例如我们百度搜索社会王。开启审查元素搜索。

然后此时即可复制完整的curl命令进行提交

curl “https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=shehuiwan^&json=1^&p=3^&sid=1436_21116_18559_22159^&req=2^&csor=9^&pwd=shehuiwa^&cb=jQuery1102004371613380728823_1506250840126^&_=1506250840137” -H “Accept-Encoding: gzip, deflate, br” -H “Accept-Language: zh-CN,zh;q=0.8” -H “User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36” -H “Accept: */*” -H “Referer: https://www.baidu.com/” -H “Cookie: BIDUPSID=C217A1735D932912AB88C278B7D33F97; PSTM=1505908881; BAIDUID=6957F525EA4F446660E898CD517F0D60:FG=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; PSINO=6; H_PS_PSSID=1436_21116_18559_22159” -H “Connection: keep-alive” –compressed

简单来分析一下参数。

Curl后跟的是网址。-H参数则是head头。可以无限加。一段一个-H –compressed要求返回是压缩的形势。

上述是GET请求。我们来尝试一个POST请求。

以52破解回帖为例

curl “https://www.52pojie.cn/forum.php?mod=post^&action=reply^&fid=16^&tid=647011^&extra=page^%^3D1^&replysubmit=yes^&infloat=yes^&handlekey=fastpost^&inajax=1” -H “Cookie: htVD_2132_saltkey=nWwCIPre; htVD_2132_lastvisit=1506247218; _uab_collina=150625118517833586180194; htVD_2132_pc_size_c=0; _umdata=2BA477700510A7DFE5E15B937AF41A78856C4FC6BB7A0E19AD35ED5E160D9111F55F62A8C680D710CD43AD3E795C914C4D4FA1EE76C04CC28609516E2AAB33F4; htVD_2132_ulastactivity=4376ZXyx0m3I1uZdlwaNBncy0tCsDZJaYHh0gZ6RDYnMg0kaSjpy; htVD_2132_auth=d771GWpfzYc3vk4Zh^%^2FbIketZa^%^2FPp^%^2FQgX^%^2BMHoiqnOZ3xV1yxlY7d2iP^%^2FzJG2caGck8kYFvVqtBkSHym9z4O^%^2Bj2gAzHRQ; htVD_2132_lastcheckfeed=277491^%^7C1506250995; htVD_2132_lip=219.129.183.218^%^2C1504788655; htVD_2132_nofavfid=1; htVD_2132_ttask=277491^%^7C20170924; htVD_2132_visitedfid=16; htVD_2132_sid=ZKKa34; Hm_lvt_46d556462595ed05e05f009cdafff31a=1506251186; Hm_lpvt_46d556462595ed05e05f009cdafff31a=1506251208; htVD_2132_smile=1D1; htVD_2132_clearUserdata=forum; htVD_2132_connect_not_sync_t=1; htVD_2132_lastact=1506251042^%^09forum.php^%^09viewthread; htVD_2132_connect_is_bind=0; htVD_2132_st_p=277491^%^7C1506251042^%^7Cbc220be8d065bda3f21e60eb8872a6fc; htVD_2132_viewid=tid_647011” -H “Origin: https://www.52pojie.cn” -H “Accept-Encoding: gzip, deflate, br” -H “Accept-Language: zh-CN,zh;q=0.8” -H “Upgrade-Insecure-Requests: 1” -H “User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36” -H “Content-Type: application/x-www-form-urlencoded” -H “Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8” -H “Cache-Control: max-age=0” -H “Referer: https://www.52pojie.cn/thread-647011-1-1.html” -H “Connection: keep-alive” –data “message=xda^%^CA^%^C7^%^B9^%^FA^%^CD^%^E2^%^C2^%^DB^%^CC^%^B3^%^C2^%^F0^&posttime=1506251003^&formhash=15e8ebc3^&usesig=1^&subject=++” –compressed

–data则是要POST的内容。其他都是一样的。另外附上一份参数解释表

-a/--append 上传文件时,附加到目标文件

  -A/--user-agent <string>  设置用户代理发送给服务器

  - anyauth   可以使用“任何”身份验证方法

  -b/--cookie <name=string/file> cookie字符串或文件读取位置

  - basic 使用HTTP基本验证

  -B/--use-ascii 使用ASCII /文本传输

  -c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中

  -C/--continue-at <offset>  断点续转

  -d/--data <data>   HTTP POST方式传送数据

  --data-ascii <data>  以ascii的方式post数据

  --data-binary <data> 以二进制的方式post数据

  --negotiate     使用HTTP身份验证

  --digest        使用数字身份验证

  --disable-eprt  禁止使用EPRT或LPRT

  --disable-epsv  禁止使用EPSV

  -D/--dump-header <file> 把header信息写入到该文件中

  --egd-file <file> 为随机数据(SSL)设置EGD socket路径

  --tcp-nodelay   使用TCP_NODELAY选项

  -e/--referer 来源网址

  -E/--cert <cert[:passwd]> 客户端证书文件和密码 (SSL)

  --cert-type <type> 证书文件类型 (DER/PEM/ENG) (SSL)

  --key <key>     私钥文件名 (SSL)

  --key-type <type> 私钥文件类型 (DER/PEM/ENG) (SSL)

  --pass  <pass>  私钥密码 (SSL)

  --engine <eng>  加密引擎使用 (SSL). "--engine list" for list

  --cacert <file> CA证书 (SSL)

  --capath <directory> CA目录 (made using c_rehash) to verify peer against (SSL)

  --ciphers <list>  SSL密码

  --compressed    要求返回是压缩的形势 (using deflate or gzip)

  --connect-timeout <seconds> 设置最大请求时间

  --create-dirs   建立本地目录的目录层次结构

  --crlf          上传是把LF转变成CRLF

  -f/--fail          连接失败时不显示http错误

  --ftp-create-dirs 如果远程目录不存在,创建远程目录

  --ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用

  --ftp-pasv      使用 PASV/EPSV 代替端口

  --ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址

  --ftp-ssl       尝试用 SSL/TLS 来进行ftp数据传输

  --ftp-ssl-reqd  要求用 SSL/TLS 来进行ftp数据传输

  -F/--form <name=content> 模拟http表单提交数据

  -form-string <name=string> 模拟http表单提交数据

  -g/--globoff 禁用网址序列和范围使用{}和[]

  -G/--get 以get的方式来发送数据

  -h/--help 帮助

  -H/--header <line>自定义头信息传递给服务器

  --ignore-content-length  忽略的HTTP头信息的长度

  -i/--include 输出时包括protocol头信息

  -I/--head  只显示文档信息

  从文件中读取-j/--junk-session-cookies忽略会话Cookie

  - 界面<interface>指定网络接口/地址使用

  - krb4 <级别>启用与指定的安全级别krb4

  -j/--junk-session-cookies 读取文件进忽略session cookie

  --interface <interface> 使用指定网络接口/地址

  --krb4 <level>  使用指定安全级别的krb4

  -k/--insecure 允许不使用证书到SSL站点

  -K/--config  指定的配置文件读取

  -l/--list-only 列出ftp目录下的文件名称

  --limit-rate <rate> 设置传输速度

  --local-port<NUM> 强制使用本地端口号

  -m/--max-time <seconds> 设置最大传输时间

  --max-redirs <num> 设置最大读取的目录数

  --max-filesize <bytes> 设置最大下载的文件总量

  -M/--manual  显示全手动

  -n/--netrc 从netrc文件中读取用户名和密码

  --netrc-optional 使用 .netrc 或者 URL来覆盖-n

  --ntlm          使用 HTTP NTLM 身份验证

  -N/--no-buffer 禁用缓冲输出

  -o/--output 把输出写到该文件中

  -O/--remote-name 把输出写到该文件中,保留远程文件的文件名

  -p/--proxytunnel   使用HTTP代理

  --proxy-anyauth 选择任一代理身份验证方法

  --proxy-basic   在代理上使用基本身份验证

  --proxy-digest  在代理上使用数字身份验证

  --proxy-ntlm    在代理上使用ntlm身份验证

  -P/--ftp-port <address> 使用端口地址,而不是使用PASV

  -Q/--quote <cmd>文件传输前,发送命令到服务器

  -r/--range <range>检索来自HTTP/1.1或FTP服务器字节范围

  --range-file 读取(SSL)的随机文件

  -R/--remote-time   在本地生成文件时,保留远程文件时间

  --retry <num>   传输出现问题时,重试的次数

  --retry-delay <seconds>  传输出现问题时,设置重试间隔时间

  --retry-max-time <seconds> 传输出现问题时,设置最大重试时间

  -s/--silent静音模式。不输出任何东西

  -S/--show-error   显示错误

  --socks4 <host[:port]> 用socks4代理给定主机和端口

  --socks5 <host[:port]> 用socks5代理给定主机和端口

  --stderr <file>
-t/--telnet-option <OPT=val> Telnet选项设置

  --trace <file>  对指定文件进行debug

  --trace-ascii <file> Like --跟踪但没有hex输出

  --trace-time    跟踪/详细输出时,添加时间戳

  -T/--upload-file <file> 上传文件

  --url <URL>     Spet URL to work with

  -u/--user <user[:password]>设置服务器的用户和密码

  -U/--proxy-user <user[:password]>设置代理用户名和密码

  -v/--verbose

  -V/--version 显示版本信息

  -w/--write-out [format]什么输出完成后

  -x/--proxy <host[:port]>在给定的端口上使用HTTP代理

  -X/--request <command>指定什么命令

  -y/--speed-time 放弃限速所要的时间。默认为30

  -Y/--speed-limit 停止传输速度的限制,速度时间'秒

  -z/--time-cond  传送时间设置

  -0/--http1.0  使用HTTP 1.0

  -1/--tlsv1  使用TLSv1(SSL)

  -2/--sslv2 使用SSLv2的(SSL)

  -3/--sslv3         使用的SSLv3(SSL)

  --3p-quote      like -Q for the source URL for 3rd party transfer

  --3p-url        使用url,进行第三方传送

  --3p-user       使用用户名和密码,进行第三方传送

  -4/--ipv4   使用IP4

  -6/--ipv6   使用IP6

  -#/--progress-bar 用进度条显示当前的传送状态

  -a/--append 上传文件时,附加到目标文件

  -A/--user-agent <string>  设置用户代理发送给服务器

  - anyauth   可以使用“任何”身份验证方法

  -b/--cookie <name=string/file> cookie字符串或文件读取位置

  - basic 使用HTTP基本验证

  -B/--use-ascii 使用ASCII /文本传输

  -c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中

  -C/--continue-at <offset>  断点续转

  -d/--data <data>   HTTP POST方式传送数据

  --data-ascii <data>  以ascii的方式post数据

  --data-binary <data> 以二进制的方式post数据

  --negotiate     使用HTTP身份验证

  --digest        使用数字身份验证

  --disable-eprt  禁止使用EPRT或LPRT

  --disable-epsv  禁止使用EPSV

  -D/--dump-header <file> 把header信息写入到该文件中

  --egd-file <file> 为随机数据(SSL)设置EGD socket路径

  --tcp-nodelay   使用TCP_NODELAY选项

  -e/--referer 来源网址

  -E/--cert <cert[:passwd]> 客户端证书文件和密码 (SSL)

  --cert-type <type> 证书文件类型 (DER/PEM/ENG) (SSL)

  --key <key>     私钥文件名 (SSL)

  --key-type <type> 私钥文件类型 (DER/PEM/ENG) (SSL)

  --pass  <pass>  私钥密码 (SSL)

  --engine <eng>  加密引擎使用 (SSL). "--engine list" for list

  --cacert <file> CA证书 (SSL)

  --capath <directory> CA目录 (made using c_rehash) to verify peer against (SSL)

  --ciphers <list>  SSL密码

  --compressed    要求返回是压缩的形势 (using deflate or gzip)

  --connect-timeout <seconds> 设置最大请求时间

  --create-dirs   建立本地目录的目录层次结构

  --crlf          上传是把LF转变成CRLF

  -f/--fail          连接失败时不显示http错误

  --ftp-create-dirs 如果远程目录不存在,创建远程目录

  --ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用

  --ftp-pasv      使用 PASV/EPSV 代替端口

  --ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址

  --ftp-ssl       尝试用 SSL/TLS 来进行ftp数据传输

  --ftp-ssl-reqd  要求用 SSL/TLS 来进行ftp数据传输

  -F/--form <name=content> 模拟http表单提交数据

  -form-string <name=string> 模拟http表单提交数据

  -g/--globoff 禁用网址序列和范围使用{}和[]

  -G/--get 以get的方式来发送数据

  -h/--help 帮助

  -H/--header <line>自定义头信息传递给服务器

  --ignore-content-length  忽略的HTTP头信息的长度

  -i/--include 输出时包括protocol头信息

  -I/--head  只显示文档信息

  从文件中读取-j/--junk-session-cookies忽略会话Cookie

  - 界面<interface>指定网络接口/地址使用

  - krb4 <级别>启用与指定的安全级别krb4

  -j/--junk-session-cookies 读取文件进忽略session cookie

  --interface <interface> 使用指定网络接口/地址

  --krb4 <level>  使用指定安全级别的krb4

  -k/--insecure 允许不使用证书到SSL站点

  -K/--config  指定的配置文件读取

  -l/--list-only 列出ftp目录下的文件名称

  --limit-rate <rate> 设置传输速度

  --local-port<NUM> 强制使用本地端口号

  -m/--max-time <seconds> 设置最大传输时间

  --max-redirs <num> 设置最大读取的目录数

  --max-filesize <bytes> 设置最大下载的文件总量
-M/--manual  显示全手动

  -n/--netrc 从netrc文件中读取用户名和密码

  --netrc-optional 使用 .netrc 或者 URL来覆盖-n

  --ntlm          使用 HTTP NTLM 身份验证

  -N/--no-buffer 禁用缓冲输出

  -o/--output 把输出写到该文件中

  -O/--remote-name 把输出写到该文件中,保留远程文件的文件名

  -p/--proxytunnel   使用HTTP代理

  --proxy-anyauth 选择任一代理身份验证方法

  --proxy-basic   在代理上使用基本身份验证

  --proxy-digest  在代理上使用数字身份验证

  --proxy-ntlm    在代理上使用ntlm身份验证

  -P/--ftp-port <address> 使用端口地址,而不是使用PASV

  -Q/--quote <cmd>文件传输前,发送命令到服务器

  -r/--range <range>检索来自HTTP/1.1或FTP服务器字节范围

  --range-file 读取(SSL)的随机文件

  -R/--remote-time   在本地生成文件时,保留远程文件时间

  --retry <num>   传输出现问题时,重试的次数

  --retry-delay <seconds>  传输出现问题时,设置重试间隔时间

  --retry-max-time <seconds> 传输出现问题时,设置最大重试时间

  -s/--silent静音模式。不输出任何东西

  -S/--show-error   显示错误

  --socks4 <host[:port]> 用socks4代理给定主机和端口

  --socks5 <host[:port]> 用socks5代理给定主机和端口

  --stderr <file>

  -t/--telnet-option <OPT=val> Telnet选项设置

  --trace <file>  对指定文件进行debug

  --trace-ascii <file> Like --跟踪但没有hex输出

  --trace-time    跟踪/详细输出时,添加时间戳

  -T/--upload-file <file> 上传文件

  --url <URL>     Spet URL to work with

  -u/--user <user[:password]>设置服务器的用户和密码

  -U/--proxy-user <user[:password]>设置代理用户名和密码

  -v/--verbose

  -V/--version 显示版本信息

  -w/--write-out [format]什么输出完成后

  -x/--proxy <host[:port]>在给定的端口上使用HTTP代理

  -X/--request <command>指定什么命令

  -y/--speed-time 放弃限速所要的时间。默认为30

  -Y/--speed-limit 停止传输速度的限制,速度时间'秒

  -z/--time-cond  传送时间设置

  -0/--http1.0  使用HTTP 1.0

  -1/--tlsv1  使用TLSv1(SSL)

  -2/--sslv2 使用SSLv2的(SSL)

  -3/--sslv3         使用的SSLv3(SSL)

  --3p-quote      like -Q for the source URL for 3rd party transfer

  --3p-url        使用url,进行第三方传送

  --3p-user       使用用户名和密码,进行第三方传送

  -4/--ipv4   使用IP4

  -6/--ipv6   使用IP6

  -#/--progress-bar 用进度条显示当前的传送状态

 

 

Base64非默认编码表加密测试

Li, Json阅读(13)

Base64加密下会有一张编码表。但如果这张编码表顺序被打乱了呢?

思路来源于FreeBuf:http://www.freebuf.com/articles/database/140773.html

代码基于C++语言编写,先放出来C++下的Base64加密

unsigned char * base64 = (unsigned char *)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
CString base64encode(CString src, int srclen)
{
	int n, buflen, i, j;
	static unsigned char *dst;
	CString buf = src;
	buflen = n = srclen;
	dst = (unsigned char*)malloc(buflen / 3 * 4 + 3);
	memset(dst, 0, buflen / 3 * 4 + 3);
	for (i = 0, j = 0; i <= buflen - 3; i += 3, j += 4) {
		dst[j] = (buf[i] & 0xFC) >> 2;
		dst[j + 1] = ((buf[i] & 0x03) << 4) + ((buf[i + 1] & 0xF0) >> 4);
		dst[j + 2] = ((buf[i + 1] & 0x0F) << 2) + ((buf[i + 2] & 0xC0) >> 6);
		dst[j + 3] = buf[i + 2] & 0x3F;
	}
	if (n % 3 == 1) {
		dst[j] = (buf[i] & 0xFC) >> 2;
		dst[j + 1] = ((buf[i] & 0x03) << 4);
		dst[j + 2] = 64;
		dst[j + 3] = 64;
		j += 4;
	}
	else if (n % 3 == 2) {
		dst[j] = (buf[i] & 0xFC) >> 2;
		dst[j + 1] = ((buf[i] & 0x03) << 4) + ((buf[i + 1] & 0xF0) >> 4);
		dst[j + 2] = ((buf[i + 1] & 0x0F) << 2);
		dst[j + 3] = 64;
		j += 4;
	}
	for (i = 0; i<j; i++) /* map 6 bit value to base64 ASCII character */
		dst[i] = base64[(int)dst[i]];
	dst[j] = 0;
	return CString(dst);
}

调用方法如下:

printf("%s",base64encode(“hello”,5));

第一个参数是要编码的字符串,后面就是这个字符串长度。如此一来,编码过后为aGVsbG8=,现在要做的就是打乱编码。然后这个不是重点。另外。我们在打乱编码以后,也是可以正常编码的。上面是一段编码的,我们来进行一下解码。首先我们把编码字符串进行修改为:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=

然后我们编码试试来解码(此时的hello被编码成了AgvSBg8=)

CString base64decode(CString inpt,int * len)
{
     int n,i,j,pad;
     unsigned char *p;
     static unsigned char *dst;
     unsigned char * src;
     *len=0;
     pad=0;
     n=inpt.GetLength();
     src=new unsigned char [n];
     for(i=0;i<n;i++)
         src[i]=inpt[i];
 
     while(n>0&&src[n-1]=='=') {
         src[n-1]=0;
         pad++;
         n--;
     }
     for(i=0;i<n;i++)   { /* map base64 ASCII character to 6 bit value */
         p=(unsigned char *)strchr((const char *)base64,(int)src[i]);
         if(!p)
              break;
         src[i]=p-(unsigned char *)base64;
     }
 
     dst=(unsigned char *)malloc(n*3/4+1);
     memset(dst,0,n*3/4+1);
     for(i=0,j=0;i<n;i+=4,j+=3) {
         dst[j]=(src[i]<<2) + ((src[i+1]&0x30)>>4);
         dst[j+1]=((src[i+1]&0x0F)<<4) + ((src[i+2]&0x3C)>>2);
         dst[j+2]=((src[i+2]&0x03)<<6) + src[i+3];
         *len+=3;
     }
     *len-=pad;
     return CString(dst);
}

解码即可还原成原来字符串hello

 

MD5加密函数封装类

Li, Json阅读(83)

默认是供给MFC使用,如若其他类型程序使用请包含头 并在工程文件里使用MFC库

如果在非MFC程序下使用,请注意在头文件里包含<afxwin.h> 否则会编译出错。

测试代码:

#include "stdafx.h"
#include "md5a.h"
#include <afxwin.h>
int main(int argc, char* argv[])
{
	char *cTemp = (char *)(LPCTSTR)"admin";
	char *cIdentity;
	CMd5A md5;
	cIdentity = md5.MDString(cTemp);
	CString	m_sEncrypt;
	m_sEncrypt = CString(cIdentity);
	printf("%s",m_sEncrypt);
	//AfxMessageBox(m_sEncrypt);
	getchar();
	return 0;
}

实例测试:

MD5加密封装类

这里再把他封装成一个函数来调用如下使用:

CString md5cp(CString str)
{
	char *cTemp = (char *)(LPCTSTR)str;
	char *cIdentity;
	CMd5A md5;
	cIdentity = md5.MDString(cTemp);
	CString	m_sEncrypt;
	m_sEncrypt = CString(cIdentity);
	return m_sEncrypt;
}
int main(int argc, char* argv[])
{
	printf("%s",md5cp("admin"));
	getchar();
	return 0;
}

最后所有文件已经打包上传到OsChina

http://git.oschina.net/modog/md5JiaMiFengZhuangLei

 

 

基于Unicode编码下的GBK转UTF8

Li, Json阅读(15)

基于Unicode编码下的GBK转UTF8,Ansi下不可用

void ConvertUtf8ToGBK(CString& strUtf8) {
    int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
    unsigned short * wszGBK = new unsigned short[len+1];
    memset(wszGBK, 0, len * 2 + 2);
    MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len);

    len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL); 
    char *szGBK=new char[len + 1];
    memset(szGBK, 0, len + 1);
    WideCharToMultiByte (CP_ACP, 0, wszGBK, -1, szGBK, len, NULL,NULL);

    strUtf8 = szGBK;
    delete[] szGBK;
    delete[] wszGBK;
}

 

基于Unicode编码下的GBK转UTF8

Li, Json阅读(21)

基于Unicode编码下的GBK转UTF8,Ansi下不可用

void ConvertGBKToUtf8(CString& strGBK) {
    int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
    unsigned short * wszUtf8 = new unsigned short[len+1];
    memset(wszUtf8, 0, len * 2 + 2);
    MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);

    len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL); 
    char *szUtf8=new char[len + 1];
    memset(szUtf8, 0, len + 1);
    WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL,NULL);

    strGBK = szUtf8;
    delete[] szUtf8;
    delete[] wszUtf8;
}

StartRat3.1修改笔记-添加上线信息[连载中]

饭不多吃话不多说阅读(138)

主要目标:添加上线时获取的数据
首要还是需要在服务端修改一下那个登录时候的一个数据包 区域代码定位如下:

Server\common\login.h

紧接着呢,是一个函数。SendLoginInfo

int sendLoginInfo(LPCTSTR strServiceName, CClientSocket *pClient, DWORD dwSpeed)
{
    int nRet = SOCKET_ERROR;
    // 登录信息
    LOGININFO   LoginInfo;
    // 开始构造数据
    LoginInfo.bToken = TOKEN_LOGIN; // 令牌为登录
    LoginInfo.bIsWebCam = 0; //没有摄像头
    LoginInfo.OsVerInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    GetVersionEx((OSVERSIONINFO *)&LoginInfo.OsVerInfoEx); // 注意转换类型
    GetNtVersionNumbers(LoginInfo.OsVerInfoEx.dwMajorVersion,LoginInfo.OsVerInfoEx.dwMinorVersion,LoginInfo.OsVerInfoEx.dwBuildNumber);
    // 主机名
    char hostname[256];
    GetHostRemark(hostname, sizeof(hostname));
    // 连接的IP地址
    sockaddr_in  sockAddr;
    memset(&sockAddr, 0, sizeof(sockAddr));
    int nSockAddrLen = sizeof(sockAddr);
    getsockname(pClient->m_Socket, (SOCKADDR*)&sockAddr, &nSockAddrLen);
    memcpy(&LoginInfo.IPAddress, (void *)&sockAddr.sin_addr, sizeof(IN_ADDR));
    memcpy(&LoginInfo.HostName, hostname, sizeof(LoginInfo.HostName));
    // CPU
    LoginInfo.dwCPUClockMhz = CPUClockMhz();
    SYSTEM_INFO SysInfo;//用于获取CPU个数的
    GetSystemInfo(&SysInfo);
    LoginInfo.nCPUNumber = SysInfo.dwNumberOfProcessors;
    
    //内存大小
    MEMORYSTATUS    MemInfo; 
    MemInfo.dwLength=sizeof(MemInfo); 
    GlobalMemoryStatus(&MemInfo);
    LoginInfo.MemSize = MemInfo.dwTotalPhys/1024/1024;
    //摄像头
    LoginInfo.bIsWebCam = IsWebCam();
    // Speed
    LoginInfo.dwSpeed = dwSpeed;
    //QQ信息   20170205添加
   strcpy(LoginInfo.IsLoginQQ, "200748960");
    //上线版本
    strcpy(LoginInfo.szVersion, MyDecode(szVersion));
    // 上线分组
    char    *UpRow = NULL;
    char Group[256];
    char strWirn2[] = {'D','e','f','a','u','l','t','\0'};
    if(GetGroupName(Group, sizeof(Group))==0)
    {
        if(szGroup != NULL)
        {
            UpRow = (char *)(MyDecode(szGroup));
        }
        else
        {
            UpRow = strWirn2;
        }
    }
    else
    {
        UpRow=Group;
    }
    strcpy(LoginInfo.UpGroup,UpRow);
    nRet = pClient->Send((LPBYTE)&LoginInfo, sizeof(LOGININFO));
    return nRet;
}

注意下这里  我们修改一下这个上线的结构体

 选中Logininfo鼠标右键查看定义即可
typedef struct
{    
    BYTE            bToken;         // = 1
    OSVERSIONINFOEX OsVerInfoEx;    // 版本信息
    DWORD           dwCPUClockMhz;  // CPU频率
    int             nCPUNumber;     // CPU核数
    IN_ADDR         IPAddress;      // 存储32位的IPv4的地址数据结构
    char            HostName[50];   // 主机名
    bool            bIsWebCam;      // 是否有摄像头
    DWORD           dwSpeed;        // 网速
    DWORD           MemSize;        // 内存大小
    char            UpGroup[50];    // 上线分组
    char            szVersion[32];  // 上线版本
    char            IsLoginQQ[50]; //wo我们新添加
}LOGININFO;

我们紧接着先编译一下。这边dll已经好了.后续的一些工作我这里不剉赘述
现在我们在客户端上也要做一些修改
此时的界面如下

StartRat3.1修改笔记-添加上线信息

在界面上我做了一些小小的修改。不是很大,忽略即可!现在我们要针对列表框进行一下修改 添加一个新的栏目

LISTHEAD g_Column_Data[] = 
{
    {_T("ID"),              60  },//0
    {_T("WAN"),             102 },//1
    {_T("LAN"),             102 },//2
    {_T("计算机名/备注"),   80  },//3
    {_T("操作系统"),        80  },//4
    {_T("CPU信息"),         85  },//5
    {_T("内存大小"),        65  },//6
    {_T("速度"),            36  },//7
    {_T("视频"),            36  },//8
    {_T("版本"),            45  },//9
//  {_T("DDOS"),            50  },//10        //20170205干掉DDOS
    {_T("地理位置"),        130 },
    {_T("QQ"),      130 }
};

紧接着查找一下CClientVIwer这个类 里面有一个OnAddtoList函数
部分片段如下

// 内网IP
        m_pListCtrl->SetItemText(i, 2, inet_ntoa(LoginInfo->IPAddress));
        // 主机名
        m_pListCtrl->SetItemText(i, 3, LoginInfo->HostName);
        ////////////////////////////////////////////////////////////////////////////////////////

先简单修改一下吧
依葫芦 画瓢

 //20170205新增加接受QQ信息
        m_pListCtrl->SetItemText(i, 11, LoginInfo->IsLoginQQ);

然后看看效果