文件I / O - 显示文件的内容

时间:2016-05-04 21:27:09

标签: c++ linux file-io system-calls tcpserver

我正在寻找关于简单TCP服务器的功能的一些建议。

第三个if语句,用于检查token[1]是否是文件或目录的名称(工作正常)。我的问题是,打开文件,将文件的内容显示给客户端,然后关闭文件。我尝试过使用文件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] = '\0';
 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);
}

1 个答案:

答案 0 :(得分:2)

如果您只打开文件,则无法读取文件:

fd = open(token[1], O_WRONLY); //open

如果你不想给它写任何东西,你需要打开它进行阅读,O_RDONLY,否则就是O_RDWR。

顺便说一下 - 你的缓冲区大小是奇数(257),通常,一个以2(256)的幂分配缓冲区。

更新:

警告读取不一定是null终止字符串!使用cnt代替strlen(缓冲区)进行写入 - 但检查它是否为&lt; 0(错误)和== 0(文件结束)之前。如果您的文件可以具有任意大小(即可能大于缓冲区),您可能希望在循环中执行此操作。