最近在学习用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,如下图
接着执行strcat_s (szBuffer, sizeof (szBuffer), "中文测试") ;,我们再看看内存
可以发现,‘\0’之后的东西全部变成了-2,我们再来看看strcat的效果
可以看到都是0。
之所以我发现了这个问题,是因为我在读取网页源代码的时候,输出的结尾总有“烫烫烫烫”的字样,所以插入断点调试,发现了这个细微的差别。如果你也出现了这个问题,不妨尝试一下。
如有什么地方说得不对,欢迎指出!