linux下c语言tcp连接处理粘包实例
时间: 2023-07-27 16:18:37 浏览: 113
在 Linux 下进行 TCP 连接时,会经常遇到 TCP 粘包的问题。TCP 粘包的原因是网络传输的数据是以数据流的形式传输的,而不是以消息的形式传输。这就意味着在接收端,可能会将多个发送端发送的消息合并成一个消息,或者将一个消息拆分成多个消息。
以下是一个 C 语言处理 TCP 粘包的简单示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAXLINE 1024
int main(int argc, char **argv) {
int sockfd;
struct sockaddr_in servaddr;
char sendline[MAXLINE], recvline[MAXLINE];
if (argc != 2) {
printf("usage: ./client <IP address>\n");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("socket error\n");
exit(1);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8888);
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) {
printf("inet_pton error\n");
exit(1);
}
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
printf("connect error\n");
exit(1);
}
while (fgets(sendline, MAXLINE, stdin) != NULL) {
write(sockfd, sendline, strlen(sendline));
if (read(sockfd, recvline, MAXLINE) == 0) {
printf("server terminated prematurely\n");
exit(1);
}
// 处理 TCP 粘包
int len = strlen(recvline);
if (recvline[len - 1] == '\n') {
recvline[len - 1] = '\0';
}
printf("received: %s\n", recvline);
}
exit(0);
}
```
在这个示例中,我们使用了 while 循环来不断地读取用户输入,并将用户输入的数据写入到 socket 中。在读取服务器返回的数据时,我们使用了一个简单的方法来处理 TCP 粘包问题。如果接收到的数据最后一个字符是换行符,则将其替换为字符串结束符。
这只是一个简单的示例,实际上在处理 TCP 粘包时还有许多其他的方法,例如使用定长消息、使用消息长度前缀等等。
阅读全文