【发布时间】:2022-01-22 18:35:43
【问题描述】:
我正在构建一个应用 TCP 服务器客户端,我想将二进制文件发送到服务器/客户端(所以我不想使用发送和接收)并且我有一个问题,我想读取文件描述符我的客户端它不工作我不明白为什么因为服务器正确接受客户端所以我做了这个功能:
bool accept_and_read_client(){
struct sockaddr_in new_client = { 0 };
socklen_t length = sizeof(new_client);
int val_return = accept(sock_fd, (struct sockaddr*)&new_client, &length);
if(val_return < 0){
syserr("error of accept");
return true;
}
printf("accept of client successful\n");
client_array[0].fd = val_return;
size_t nbread;
client_array[0].file = fdopen(client_array[0].fd, "w+");
nbread = fread(&val_return, sizeof(char), sizeof(MAX_BUFF), client_array[0].file);
if(nbread < -1){
syserr("fread");
return true;
}
printf("number i read : %ld\n", nbread);
return false;
}
当我启动服务器时,服务器等待客户端,当我进行 ./client 测试时,服务器说:
accept of client successful
fread: Success
所以函数 fread 失败了。
在 client.c 上,我像这样进行 fwrite:
...
FILE* fdc = fdopen(sock_fd, "w+");
if(fdc == NULL){
syserr("error of fdopen");
return 1;
}
printf("%s\n", argv[1]);
size_t nb_write = fwrite(argv[1], sizeof(*argv), strlen(argv[1]), fdc);
printf("number i write: %ld\n", nb_write);
if(fflush(fdc)){
syserr("fflush");
}
如果你想查看客户端结构:
struct client{
int fd;
// char buffer[MAX_BUFF];
FILE* file;
};
struct client client_array[MAX_CLIENTS];
如果有人知道为什么 fread 不起作用,请告诉我
【问题讨论】:
-
首先您尝试读取
sizeof(MAX_BUFF)元素。这很可能是4,因为我猜MAX_BUFF是一个扩展为int值的宏,并且在大多数系统上sizeof(int)等于4。我怀疑您想改为阅读MAX_BUFF元素。 -
第二个问题是当您尝试将
MAX_BUFF字符读入val_return变量时,因为它是一个只能容纳4字节的int变量。你真正想读什么? -
最后,如果
fread失败,您需要检查feof和ferror以确定失败的原因。此外,在一切正常时返回true失败和false似乎是错误的。 -
哦,顺便说一句,
client_array[0].fd?为什么你总是使用索引0?您一次不会有多个活动连接吗? -
所以根据你的说法,我读到了不好的东西,所以我要向你解释我想读的内容,我在
argv[1]上向客户发送一条消息,所以./client test 发送这个词使用函数fwrite和 server.ci 上的函数“测试”希望接受客户端并读取 fdc
标签: c sockets server tcp fread