C++的UDP通讯发json
时间: 2023-10-21 15:09:09 浏览: 50
要使用C++进行UDP通讯发送JSON数据,可以使用以下步骤:
1. 导入必要的头文件和库文件
```cpp
#include <iostream>
#include <winsock2.h> // for Windows
#include <json/json.h> // for JSON
#pragma comment(lib, "ws2_32.lib") // for Windows
```
2. 初始化Winsock库
```cpp
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "WSAStartup failed." << std::endl;
return 1;
}
```
3. 创建UDP套接字
```cpp
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == INVALID_SOCKET) {
std::cerr << "Failed to create socket." << std::endl;
WSACleanup();
return 1;
}
```
4. 设置UDP套接字的IP地址和端口号
```cpp
sockaddr_in serverAddr;
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 设置为目标IP地址
serverAddr.sin_port = htons(9000); // 设置为目标端口号
```
5. 创建JSON对象并序列化为字符串
```cpp
Json::Value root;
root["name"] = "Alice";
root["age"] = 18;
std::string jsonStr = root.toStyledString();
```
6. 发送JSON字符串到目标地址
```cpp
sendto(sock, jsonStr.c_str(), jsonStr.size(), 0, (sockaddr*)&serverAddr, sizeof(serverAddr));
```
7. 关闭UDP套接字和Winsock库
```cpp
closesocket(sock);
WSACleanup();
```
完整的代码示例:
```cpp
#include <iostream>
#include <winsock2.h>
#include <json/json.h>
#pragma comment(lib, "ws2_32.lib")
int main() {
// 初始化Winsock库
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "WSAStartup failed." << std::endl;
return 1;
}
// 创建UDP套接字
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == INVALID_SOCKET) {
std::cerr << "Failed to create socket." << std::endl;
WSACleanup();
return 1;
}
// 设置UDP套接字的IP地址和端口号
sockaddr_in serverAddr;
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serverAddr.sin_port = htons(9000);
// 创建JSON对象并序列化为字符串
Json::Value root;
root["name"] = "Alice";
root["age"] = 18;
std::string jsonStr = root.toStyledString();
// 发送JSON字符串到目标地址
sendto(sock, jsonStr.c_str(), jsonStr.size(), 0, (sockaddr*)&serverAddr, sizeof(serverAddr));
// 关闭UDP套接字和Winsock库
closesocket(sock);
WSACleanup();
return 0;
}
```