赞
踩
最近在学习用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。
之所以我发现了这个问题,是因为我在读取网页源代码的时候,输出的结尾总有“烫烫烫烫”的字样,所以插入断点调试,发现了这个细微的差别。如果你也出现了这个问题,不妨尝试一下。
如有什么地方说得不对,欢迎指出!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。