写一个C++回调函数使用实例。在MFC项目中,socket客户端recv函数收到数据,将数据传给回调函数处理。
时间: 2024-04-14 22:29:56 浏览: 179
在MFC项目中,可以使用函数指针或者函数对象来实现回调函数。下面是一个使用函数指针的示例,演示了如何在socket客户端接收数据时使用回调函数进行数据处理:
```cpp
#include <iostream>
#include <functional>
#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
const int MAX_BUFFER_SIZE = 1024;
// 定义回调函数类型
typedef std::function<void(const char*, int)> ReceiveCallback;
// 接收数据并调用回调函数处理
void ReceiveData(int clientSocket, ReceiveCallback callback) {
char buffer[MAX_BUFFER_SIZE];
memset(buffer, 0, sizeof(buffer));
int bytesRead = recv(clientSocket, buffer, sizeof(buffer) - 1, 0);
if (bytesRead > 0) {
// 调用回调函数处理接收到的数据
callback(buffer, bytesRead);
} else if (bytesRead == 0) {
// 连接关闭
std::cout << "Connection closed by the server." << std::endl;
} else {
// 接收错误
std::cerr << "Error receiving data from the server." << std::endl;
}
}
// 回调函数示例:将接收到的数据打印出来
void PrintReceivedData(const char* data, int length) {
std::cout << "Received data: " << std::string(data, length) << std::endl;
}
int main() {
// 创建套接字
int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == -1) {
std::cerr << "Failed to create socket." << std::endl;
return 1;
}
// 设置服务器地址和端口
std::string serverIP = "127.0.0.1";
int serverPort = 12345;
sockaddr_in serverAddress{};
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = inet_addr(serverIP.c_str());
serverAddress.sin_port = htons(serverPort);
// 连接服务器
int connectResult = connect(clientSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress));
if (connectResult == -1) {
std::cerr << "Failed to connect to the server." << std::endl;
return 1;
}
// 设置回调函数
ReceiveCallback callback = PrintReceivedData;
// 接收数据并调用回调函数处理
ReceiveData(clientSocket, callback);
// 关闭套接字
close(clientSocket);
return 0;
}
```
在上述代码中,定义了一个回调函数类型 `ReceiveCallback`,用于存储回调函数。然后定义了一个 `ReceiveData` 函数,用于接收数据并调用回调函数进行处理。在 `main` 函数中,创建了一个套接字并连接服务器,然后设置了回调函数 `PrintReceivedData`,最后调用 `ReceiveData` 函数进行数据接收和处理。
你可以根据自己的需要修改回调函数的实现和具体的数据处理逻辑。如果想要使用函数对象作为回调函数,可以使用 `std::function` 类模板来存储回调函数对象,并在调用时直接调用函数对象的重载 `operator()`。
阅读全文