是的,这是默认行为。在使用C Unix Socket时,读取系统调用read()会读取指定数量字节的数据。如果没有达到读取字节数指定的数量,就返回。而如果读取到一个新行符号('\n'),系统调用就会返回读取了全部数据。
如果需要读取特定数量的数据而不是等待读取到新行符号,可以使用一个循环来读取数据,直到达到所需字节数为止。示例如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define BUFSIZE 1024
int main(int argc, char **argv) {
// 创建套接字和设置地址
int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
servaddr.sin_port = htons(8080);
// 连接服务器
if (connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1) {
perror("connect");
exit(1);
}
// 循环读取指定数量的数据
char buf[BUFSIZE];
int len = 0;
int n = 0;
while (len < BUFSIZE) {
n = read(sockfd, buf + len, BUFSIZE - len);
if (n == -1) {
perror("read");
exit(1);
}
len += n;
}
// 打印读取的数据
printf("%s\n", buf);
// 关闭套接字
close(sockfd);
return 0;
}