在C++中使用recv函數接收數據包時,需要注意數據包可能會被分成多個部分發送,因此需要對數據進行緩存和拼接,直到接收到完整的數據包為止。以下是一個示例代碼,實現數據包的完整接收:
#include <iostream>
#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
#define BUFFER_SIZE 1024
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char buffer[BUFFER_SIZE] = {0};
// 創建socket
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
return -1;
}
// 綁定地址和端口
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8888);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
return -1;
}
// 監聽連接
if (listen(server_fd, 3) < 0) {
perror("listen failed");
return -1;
}
// 接受連接
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept failed");
return -1;
}
// 接收數據包
std::string data;
int bytes_received;
do {
bytes_received = recv(new_socket, buffer, BUFFER_SIZE, 0);
if (bytes_received < 0) {
perror("recv failed");
return -1;
}
data.append(buffer, bytes_received);
} while (bytes_received > 0);
// 處理接收到的完整數據包
std::cout << "Received data: " << data << std::endl;
return 0;
}
在上面的代碼中,創建了一個服務器并監聽連接,接收到新的連接后,使用recv函數接收數據包,直到接收到的字節數為0為止。接收到的數據會不斷追加到一個字符串變量中,直到接收到完整的數據包。最后輸出完整的接收到的數據包。