c/c++语言利用socket编程获取网络上天气预报代码
时间: 2023-12-13 13:04:01 浏览: 129
以下是一个简单的利用Socket编程获取天气预报的C++代码示例:
```c++
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <cstring>
using namespace std;
int main(int argc, char *argv[]) {
// 创建Socket
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
cerr << "Could not create socket" << endl;
return 1;
}
// 解析域名
struct hostent *he;
const char *hostname = "www.weather.com.cn";
he = gethostbyname(hostname);
if (he == NULL) {
cerr << "Could not resolve hostname" << endl;
return 1;
}
// 设置地址结构
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(80);
server.sin_addr = *((struct in_addr *) he->h_addr);
// 连接服务器
if (connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) {
cerr << "Connect failed" << endl;
return 1;
}
// 构造HTTP请求
const char *request = "GET /data/cityinfo/101010100.html HTTP/1.1\r\n"
"Host: www.weather.com.cn\r\n"
"Connection: close\r\n"
"\r\n";
// 发送HTTP请求
if (send(sock, request, strlen(request), 0) < 0) {
cerr << "Send failed" << endl;
return 1;
}
// 接收响应
char buffer[1024];
string response;
while (recv(sock, buffer, sizeof(buffer), 0) > 0) {
response += buffer;
}
// 解析响应
string start = "<!--m卡片-->";
string end = "<!--e卡片-->";
size_t startPos = response.find(start);
size_t endPos = response.find(end);
string weather = response.substr(startPos + start.length(), endPos - startPos - start.length());
cout << weather << endl;
// 关闭Socket
close(sock);
return 0;
}
```
以上代码中,我们首先创建了一个Socket,并使用gethostbyname()函数解析了天气预报网站的域名。然后,我们设置了服务器的地址结构,并使用connect()函数连接到服务器。
接下来,我们构造了一个HTTP请求,并使用send()函数向服务器发送请求。然后,我们使用recv()函数接收服务器的响应,并解析响应,提取出天气预报信息。
最后,我们关闭了Socket,结束了程序的执行。
需要注意的是,该示例代码适用于中国天气网提供的天气预报数据格式。如果你使用的是其他天气预报网站,可能需要根据其格式进行相应的修改。
阅读全文