c++使用socket通信时,接收不同长度的数据,怎样实现,请给出具体C++代码和注释
时间: 2024-05-14 19:14:28 浏览: 110
C++实现socket通信
4星 · 用户满意度95%
下面是一个接收不同长度数据的示例代码,注释已经在代码中给出:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAX_BUF_SIZE 1024
int main(int argc, char *argv[]) {
int sockfd;
struct sockaddr_in server_addr;
char buf[MAX_BUF_SIZE];
int len, total_len = 0;
// 创建socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
// 设置server_addr结构体
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
server_addr.sin_port = htons(atoi(argv[2]));
// 连接服务器
if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("connect");
exit(EXIT_FAILURE);
}
// 接收数据
while ((len = recv(sockfd, buf, MAX_BUF_SIZE, 0)) > 0) {
total_len += len;
// 处理接收到的数据
printf("Received %d bytes: %s\n", len, buf);
// 如果接收到的数据总长度超过了预设的阈值,停止接收数据
if (total_len > 1024) {
break;
}
}
// 关闭socket
close(sockfd);
return 0;
}
```
在以上代码中,我们使用了recv()函数来接收数据,该函数的参数如下:
```c
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
```
其中,sockfd是socket文件描述符,buf是用来存储接收到的数据的缓冲区,len是缓冲区的大小,flags是接收数据时的选项,一般设为0即可。
我们每次调用recv()函数时,都会接收到一定长度的数据,因此需要在循环中不断接收数据,直到接收到的数据总长度超过了预设的阈值。在本例中,我们将阈值设为1024字节,即MAX_BUF_SIZE的大小。
总之,只要不断接收数据,累加接收到的数据长度,就可以实现接收不同长度的数据。
阅读全文