文件 I/O - 显示文件的内容
File I/O - Displaying contents of a file
我正在寻找有关简单 TCP 服务器功能的建议。
第三个 if
语句,假设检查 token[1]
是文件名还是目录名(工作正常)。我的问题是,打开文件,向客户端显示文件内容,然后关闭文件。我尝试使用 file I/O 调用,但是没有办法做到这一点。非常感谢任何建议。
void processClientRequest(int connSock) {
int received, count = 0;
char *token[] = { (char*)0, (char*)0 };
char path[257], buffer[257];
// read a message from the client
if ((received = read(connSock, path, 256)) < 0) {
perror("receive");
exit(EXIT_FAILURE);
}
path[received] = '[=11=]';
cerr << "received: " << path << endl;
for(char *p = strtok(path, " "); p; p = strtok(NULL, " ")) //sets tokens
token[count++] = p;
if(strcmp(token[0], "GET") != 0) { //if the first "command" was not GET, exit
strcat(buffer, "Must start with GET");
write(connSock, buffer, strlen(buffer));
exit(-1);
}
int rs;
int fd, cnt;
struct stat bufferS;
rs = stat(token[1], &bufferS);
if (S_ISREG(bufferS.st_mode)) { //input was a file
fd = open(token[1], O_WRONLY); //open
cnt = read(fd, buffer, 257); //read
write(connSock, buffer, strlen(buffer));
}
// else, open directory and stuff (code for that has been omitted to save space)
cerr << "done with this client\n";
close(connSock);
}
如果打开文件只是为了写入,则无法读取文件:
fd = open(token[1], O_WRONLY); //open
您需要打开它进行阅读,O_RDONLY 在您的情况下,如果您不想向其中写入任何内容(否则 O_RDWR)。
顺便说一句 - 您的缓冲区大小是奇数 (257),通常情况下,一个人会以 2 的幂 (256) 分配缓冲区。
更新:
请注意,读取的字符串不一定以 null 结尾!使用 cnt 而不是 strlen(buffer) 进行写入 - 但之前检查它是否 < 0(错误)和 == 0(文件结尾)。如果您的文件可以具有任意大小(即可能大于缓冲区),您可能希望循环执行此操作。
我正在寻找有关简单 TCP 服务器功能的建议。
第三个 if
语句,假设检查 token[1]
是文件名还是目录名(工作正常)。我的问题是,打开文件,向客户端显示文件内容,然后关闭文件。我尝试使用 file I/O 调用,但是没有办法做到这一点。非常感谢任何建议。
void processClientRequest(int connSock) {
int received, count = 0;
char *token[] = { (char*)0, (char*)0 };
char path[257], buffer[257];
// read a message from the client
if ((received = read(connSock, path, 256)) < 0) {
perror("receive");
exit(EXIT_FAILURE);
}
path[received] = '[=11=]';
cerr << "received: " << path << endl;
for(char *p = strtok(path, " "); p; p = strtok(NULL, " ")) //sets tokens
token[count++] = p;
if(strcmp(token[0], "GET") != 0) { //if the first "command" was not GET, exit
strcat(buffer, "Must start with GET");
write(connSock, buffer, strlen(buffer));
exit(-1);
}
int rs;
int fd, cnt;
struct stat bufferS;
rs = stat(token[1], &bufferS);
if (S_ISREG(bufferS.st_mode)) { //input was a file
fd = open(token[1], O_WRONLY); //open
cnt = read(fd, buffer, 257); //read
write(connSock, buffer, strlen(buffer));
}
// else, open directory and stuff (code for that has been omitted to save space)
cerr << "done with this client\n";
close(connSock);
}
如果打开文件只是为了写入,则无法读取文件:
fd = open(token[1], O_WRONLY); //open
您需要打开它进行阅读,O_RDONLY 在您的情况下,如果您不想向其中写入任何内容(否则 O_RDWR)。
顺便说一句 - 您的缓冲区大小是奇数 (257),通常情况下,一个人会以 2 的幂 (256) 分配缓冲区。
更新:
请注意,读取的字符串不一定以 null 结尾!使用 cnt 而不是 strlen(buffer) 进行写入 - 但之前检查它是否 < 0(错误)和 == 0(文件结尾)。如果您的文件可以具有任意大小(即可能大于缓冲区),您可能希望循环执行此操作。