c/c++语言使用socket编程获取网络上天气预报。 要求:构造Http请求报文,发送到天气预报的服务器,并获取HTTP响应报文,将报文进行解析获取天气预报。(自己去网上找能够提供天气预报的服务器和API接口,很多) 细节:不建议直接使用HTTP的函数,要自己通过socket编程学会构造HTTP请求和解析HTTP响应,对于响应报文中夹带XML或者JSON进行解析
时间: 2024-02-23 07:57:36 浏览: 202
socket.zip_C/C++__C/C++_
这是一个非常有用的实践项目,可以帮助你更好地理解Socket编程和HTTP协议。下面是一个简单的示例代码:
```c++
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <cstring>
using namespace std;
const int BUF_SIZE = 1024; // 缓冲区大小
int main() {
const char *host = "www.weather.com.cn"; // 天气预报服务器域名
const char *path = "/data/cityinfo/101010100.html"; // 天气预报API路径
const char *user_agent = "Mozilla/5.0"; // 用户代理
const char *accept = "text/html"; // 接受类型
const char *connection = "close"; // 连接关闭
// 创建socket
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == -1) {
cerr << "Error: Could not create socket" << endl;
return 1;
}
// 获取服务器IP地址
struct hostent *he = gethostbyname(host);
if (he == NULL) {
cerr << "Error: Could not resolve hostname" << endl;
return 1;
}
// 设置服务器地址结构体
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr = *((struct in_addr *) he->h_addr);
server_addr.sin_port = htons(80);
// 连接服务器
if (connect(sock, (struct sockaddr *) &server_addr, sizeof(server_addr)) == -1) {
cerr << "Error: Could not connect to server" << endl;
return 1;
}
// 构造HTTP请求报文
char request[BUF_SIZE];
sprintf(request, "GET %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: %s\r\nAccept: %s\r\nConnection: %s\r\n\r\n",
path, host, user_agent, accept, connection);
// 发送HTTP请求报文
if (send(sock, request, strlen(request), 0) == -1) {
cerr << "Error: Could not send request" << endl;
return 1;
}
// 接收HTTP响应报文
char response[BUF_SIZE];
int recv_len;
while ((recv_len = recv(sock, response, BUF_SIZE - 1, 0)) > 0) {
response[recv_len] = '\0';
cout << response; // 输出响应报文
}
// 关闭socket
close(sock);
return 0;
}
```
这个示例代码使用了Socket编程,构造了一个HTTP请求报文,将其发送到天气预报服务器,并接收HTTP响应报文。在实际的项目中,你需要根据你所使用的天气预报API的要求,修改请求报文中的各个字段。同时,你还需要解析响应报文,从中提取出你所需要的天气预报信息。如果响应报文中夹带XML或JSON,你需要使用相应的解析库来解析它们。
阅读全文