C语言使用socket获取网页内容

来源:互联网 发布:瓷砖上铺木地板 知乎 编辑:程序博客网 时间:2024/05/21 10:41

本文讨论的是使用C语言使用socket获取网页内容


首先需要添加代码

#pragma comment(lib, "ws2_32.lib")

以下是获取网页内容的函数。函数参数为网页地址,字符串类型,如“www.baidu.com”。获取到的网页内容保存在recieved.txt文件中。

void ReadPage(char* host){WSADATA data;//winsock版本2.2int err = WSAStartup(MAKEWORD(2, 2), &data);if (err)return ;//用域名获取对方主机名struct hostent *h = gethostbyname(host);if (h == NULL)return ;//IPV4if (h->h_addrtype != AF_INET)return ;struct in_addr ina;//解析IPmemmove(&ina, h->h_addr, 4);LPSTR ipstr = inet_ntoa(ina);//Socket封装struct sockaddr_in si;si.sin_family = AF_INET;si.sin_port = htons(80);si.sin_addr.S_un.S_addr = inet_addr(ipstr);int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);connect(sock, (SOCKADDR*)&si, sizeof(si));if (sock == -1 || sock == -2)return ;//发送请求char request[1024] = "GET /?st=1 HTTP/1.1\r\nHost:";strcat(request, host);strcat(request, "\r\nConnection:Close\r\n\r\n");int ret = send(sock, request, strlen(request), 0);//获取网页内容FILE *f = fopen("recieved.txt", "w");int isstart = 0;while (ret > 0){const int bufsize = 1024;char* buf = (char*)calloc(bufsize, 1);ret = recv(sock, buf, bufsize - 1, 0);fprintf(f, "%s", buf);free(buf);}fclose(f);closesocket(sock);WSACleanup();printf("读取网页内容成功,已保存在recieved.txt中");return ;}

注:本函数只适用于IPV4的http请求。

保存的txt文件用记事本打开时,请将编码改为utf8,而不是默认的ASCII,否则会出现中文乱码。

调用这个函数的一个例子:

ReadPage("www.baidu.com")


在获取了网页信息后,可以使用C++的Regex进行分析。

文中所涉及的所有代码均在Visual Studio 2015中通过。


0 0
原创粉丝点击