tcp粘包c代码示例
时间: 2024-07-19 16:00:53 浏览: 75
TCP粘包(也称为数据分片、重组问题),是指在网络传输过程中,由于数据包的大小限制,可能会导致接收端接收到的数据不是完整的消息,而是相邻的几个小包。为了避免这种情况,通常需要在接收端进行数据的拆分和重组。以下是一个简单的C语言代码片段,展示如何通过读取TCP套接字并处理数据段来避免粘包:
```c
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define BUFFER_SIZE 1024
void process_data(char *data, int len) {
while (len > 0) {
// 如果当前缓冲区未满,添加新的数据
if (strlen(current_buffer) + len <= BUFFER_SIZE) {
strcat(current_buffer, data);
} else {
// 数据已超过缓冲区长度,处理完整的消息
handle_message(current_buffer);
current_buffer = data;
}
len -= strlen(data); // 更新剩余数据长度
data += strlen(data); // 移动指针到下一个数据块
}
}
int main() {
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
char buffer[BUFFER_SIZE] = "";
current_buffer = "";
// ... (服务器初始化代码)
// 接收客户端数据
while ((len = recv(client_fd, buffer, sizeof(buffer), 0)) > 0) {
process_data(buffer, len);
}
// 检查是否还有数据残留
if (len == -1 && errno == EAGAIN || errno == EWOULDBLOCK) {
printf("No more data to read\n");
} else if (len == 0) {
printf("Client disconnected\n");
} else {
perror("Error receiving data");
}
// ... (关闭套接字等清理工作)
return 0;
}
```
在这个例子中,`process_data`函数负责检查接收到的每个数据包,如果不足以填充整个缓冲区,则将其追加到缓冲区中;当接收到足够大的数据块时,就认为已经接收到一个完整的消息并调用`handle_message`函数处理它。
阅读全文