当前位置:   article > 正文

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

strcat出现烫烫

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

工程不适用unicode

  1. //测试socket连接网络
  2. //获取网页源代码
  3. #include <locale> //设置区域需要
  4. #include <iostream>
  5. #include <stdio.h>
  6. #include <windows.h>
  7. #pragma comment (lib, "ws2_32.lib")
  8. using namespace std ;
  9. /* utf8转unicode,因为现在还有些问题,所以先注释
  10. void utf8ToUnicode (const char * _char, TCHAR * tchar)
  11. {
  12. int iLength ;
  13. iLength = MultiByteToWideChar (CP_UTF8, 0, _char, strlen (_char) + 1, NULL, 0) ;
  14. MultiByteToWideChar (CP_UTF8, 0, _char, strlen (_char) + 1, tchar, iLength) ;
  15. }*/
  16. int main ()
  17. {
  18. WSADATA WSAData ;
  19. SOCKET sock ;
  20. struct sockaddr_in sa ;
  21. char szMessage[1000] = {NULL} ;
  22. char szBuffer[2048] = {NULL} ;
  23. wchar_t wBuffer[3000] ;
  24. string str ;
  25. setlocale (LC_ALL, "chs") ;
  26. strcat_s (szBuffer, sizeof (szBuffer), "中文测试") ;
  27. //strcat (szBuffer, "中文测试") ;
  28. //GET请求字符串
  29. strcat (szMessage, "GET / HTTP/1.1\r\nHost:") ;
  30. strcat (szMessage, "127.0.0.1") ;
  31. strcat (szMessage, "\r\nConnection:close\r\n\r\n") ;
  32. //初始化
  33. WSAStartup (MAKEWORD (2, 0), &WSAData) ;
  34. //连接socket
  35. sock = socket (AF_INET, SOCK_STREAM, 0) ; //0为服务器选择协议
  36. sa.sin_family = AF_INET ;
  37. sa.sin_port = htons (7878) ;
  38. // sa.sin_addr.S_un.S_addr = inet_addr ("117.79.93.222") ; //csdn
  39. // sa.sin_addr.S_un.S_addr = inet_addr ("59.68.63.45") ; //学校网站
  40. // sa.sin_addr.S_un.S_addr = inet_addr ("59.68.63.37") ; //学校论坛
  41. // sa.sin_addr.S_un.S_addr = inet_addr ("119.75.217.56") ; //百度
  42. // sa.sin_addr.S_un.S_addr = inet_addr ("219.138.39.150") ; //网易
  43. sa.sin_addr.S_un.S_addr = inet_addr (/*ip*/"127.0.0.1") ; //本机
  44. //连接服务器
  45. connect (sock, ((SOCKADDR *) &sa), sizeof (sa)) ;
  46. //发送请求
  47. send (sock, szMessage, sizeof (szMessage) - 1, 0) ;
  48. //这里就是接收
  49. while (recv (sock, szBuffer, 2048, 0) > 0)
  50. {
  51. //strcpy_s (szBuf2, szBuffer) ;
  52. //CharToTchar (szBuf2, wBuffer) ;
  53. cout << szBuffer ;
  54. //wcout << wBuffer ;
  55. memset (szBuffer, 0, sizeof (szBuffer)) ;
  56. //memset (wBuffer, 0, sizeof (wBuffer)) ;
  57. //strnset (szBuffer, '\0', sizeof (szBuffer)) ;
  58. }
  59. //关闭连接
  60. closesocket (sock) ;
  61. system ("pause") ;
  62. return 0 ;
  63. }

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

接着说说strcat和strcat_s的区别。

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

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

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

可以看到都是0。

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

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

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/339510
推荐阅读
相关标签
  

闽ICP备14008679号