gpt4 book ai didi

c - 服务器无法正确读取/打开客户端在 C 中发送的文件名

转载 作者:行者123 更新时间:2023-12-03 11:52:36 27 4
gpt4 key购买 nike

我正在与 C 中的套接字进行客户端/服务器交互。我想要做的是让客户端请求在服务器上读取一个文件,服务器返回文件内容的缓冲区,然后客户端打印出文件。

尽管我能够完成服务器将文件缓冲区发送到客户端并且客户端成功打印出来,但我似乎无法让服务器成功读取客户端发送的文件名。

这就是我的意思:

///This is the structure of the message that gets sent back and forth
struct message {
int code; //Just indicates 1 or 2 for readfile or writefile
int size;
char buffer[256]; //This will hold the filename when client sends readfile request
};

作品:
char *filename = "test.c";
infile = open(filename, O_RDONLY);
//Send the file and everything back to the client

不工作:
while( read(sockfd, &msg, sizeof(int) * 2) > 0) {
if(msg.code == 1) { //Perform a read operation
int infile, filesize, rr;
int length;
char output[256];
size_t rb = 0;

while(rb < msg.size) {
ssize_t r = read(sockfd, msg.buffer, msg.size - rb);
if(r < 0) {
error(sockfd, r, msg.buffer);
break;
}
rb += r;
}

msg.buffer[rb] = '\0';
//This has been printing out the correct amount
printf("\nBytes read: %i", rb);
//This has also been printing out properly
printf("\nmsg.buffer: %s", msg.buffer);

infile = open(msg.buffer, O_RDONLY);

我已经编辑以显示我的程序所处的当前状态,但仍然无法正常工作。之前,我有一个strcpy放置不当。

最佳答案

在您发布的代码中,filename未初始化。你的编译器应该已经警告过你了。如果没有,则您没有正确调用它;与 gcc ,至少做 gcc -O -Wall .

如果使用 strcpy,还需要为文件名分配内存。 .这一步在简单的程序中不是必须的;如果您在继续从客户端读取文件后需要记住文件名,则制作副本会很有用。 strdup函数结合了内存分配和字符串复制,这里很合适。

您需要检查所有系统调用的返回值。 read的返回值告诉您读取了多少字节。调用 read(fd,buf,n)允许返回小于 n字节,如果操作系统喜欢它。如果您收到的字节数少于预期,请调用 read在一个循环中。是的,几乎所有调用 read 的程序在循环中调用它,这是一个基本的 Unix/POSIX 习语。 fread函数为你做,如果你能适应它。

验证msg.code有效性的代码和 msg.size不见了。由于您已在 msg.buffer 中分配了 256 个字节,必须限制msg.size到 255。

是的,任务msg.buffer[msg.size] = '\0'是必要的,因为 open需要 '\0'名称末尾的字符(这就是它知道名称结尾的方式)。

I thought maybe strcpy was appropriate



每当您使用指针时(大部分时间是在 C 中),您需要仔细考虑您在做什么以及这些指针指向的位置,以及那里是否有足够的空间放置您想要放置的内容。 C 是一种无情的语言;四处乱扔指针和四处乱扔箭头一样危险。 画图! 有两种 C 程序员:一种在白板、纸上、沙子或其他介质上画图;以及那些在头脑中绘制图表的人(第三类仍在试图弄清楚为什么他们打印 1+1 的程序正在打印 3 )。

关于c - 服务器无法正确读取/打开客户端在 C 中发送的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3356201/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com