c++运用socket获取网页源代码以及strcat与strcat_s的小差别

最近在学习用Socket套接字方法获取网页源代码,需要发送GET请求,然后通过recv接收,先把代码贴上(也可以供以后参考)。

工程不适用unicode。

//测试socket连接网络
//获取网页源代码

#include <locale>          //设置区域需要
#include <iostream>
#include <stdio.h>
#include <windows.h>
#pragma comment (lib, "ws2_32.lib")

using namespace std ;

/*	utf8转unicode,因为现在还有些问题,所以先注释
void utf8ToUnicode (const char * _char, TCHAR * tchar)  
{  
	int iLength ;  

	iLength = MultiByteToWideChar (CP_UTF8, 0, _char, strlen (_char) + 1, NULL, 0) ;  
	MultiByteToWideChar (CP_UTF8, 0, _char, strlen (_char) + 1, tchar, iLength) ;  
}*/

int main ()
{
	WSADATA WSAData ;
	SOCKET sock ;
	struct sockaddr_in sa ;
	char szMessage[1000] = {NULL} ;
	char szBuffer[2048] = {NULL} ;
	wchar_t wBuffer[3000] ;
	string str ;

	setlocale (LC_ALL, "chs") ;
	strcat_s (szBuffer, sizeof (szBuffer), "中文测试") ;
        //strcat (szBuffer, "中文测试") ;
        //GET请求字符串
        strcat (szMessage, "GET / HTTP/1.1\r\nHost:") ;
	strcat (szMessage, "127.0.0.1") ;
	strcat (szMessage, "\r\nConnection:close\r\n\r\n") ;

	//初始化
	WSAStartup (MAKEWORD (2, 0), &WSAData) ;
	
	//连接socket
	sock = socket (AF_INET, SOCK_STREAM, 0) ; //0为服务器选择协议

	sa.sin_family = AF_INET ;
	sa.sin_port = htons (7878) ;
//	sa.sin_addr.S_un.S_addr = inet_addr ("117.79.93.222") ;	//csdn
//	sa.sin_addr.S_un.S_addr = inet_addr ("59.68.63.45") ;		//学校网站
//	sa.sin_addr.S_un.S_addr = inet_addr ("59.68.63.37") ;		//学校论坛
//	sa.sin_addr.S_un.S_addr = inet_addr ("119.75.217.56") ;	//百度
//	sa.sin_addr.S_un.S_addr = inet_addr ("219.138.39.150") ;	//网易
	sa.sin_addr.S_un.S_addr = inet_addr (/*ip*/"127.0.0.1") ;	//本机

        //连接服务器
	connect (sock, ((SOCKADDR *) &sa), sizeof (sa)) ;
        //发送请求
	send (sock, szMessage, sizeof (szMessage) - 1, 0) ;

        //这里就是接收
	while (recv (sock, szBuffer, 2048, 0) > 0)
	{
		//strcpy_s (szBuf2, szBuffer) ;
		//CharToTchar (szBuf2, wBuffer) ;

		cout << szBuffer ;
		//wcout << wBuffer ;

		memset (szBuffer, 0, sizeof (szBuffer)) ;
		//memset (wBuffer, 0, sizeof (wBuffer)) ;
		//strnset (szBuffer, '\0', sizeof (szBuffer)) ;
	}

        //关闭连接
	closesocket (sock) ;

	system ("pause") ;
	return 0 ;
}


这样就可以获取到网页的源代码了,但是如果网页采用utf8编码时,中文就会出现乱码,目前这个问题还在处理。

接着说说strcat和strcat_s的区别。

在主函数main中,我对szBuffer进行了初始化,szBuffer[0...2047]都是0,如下图

c++运用socket获取网页源代码以及strcat与strcat_s的小差别_第1张图片

接着执行strcat_s (szBuffer, sizeof (szBuffer), "中文测试") ;,我们再看看内存

c++运用socket获取网页源代码以及strcat与strcat_s的小差别_第2张图片

可以发现,‘\0’之后的东西全部变成了-2,我们再来看看strcat的效果

c++运用socket获取网页源代码以及strcat与strcat_s的小差别_第3张图片

可以看到都是0。

之所以我发现了这个问题,是因为我在读取网页源代码的时候,输出的结尾总有“烫烫烫烫”的字样,所以插入断点调试,发现了这个细微的差别。如果你也出现了这个问题,不妨尝试一下。

如有什么地方说得不对,欢迎指出!

你可能感兴趣的:(C++,socket,Stream,服务器,测试,null)