File I / O — отображение содержимого файла

Я искал несколько советов по функции для простого TCP-сервера.

Третий if заявление, следует проверить, если token[1] это имя файла или каталога (который работает нормально). Моя проблема заключается в открытии файла, отображении содержимого файла клиенту и последующем закрытии файла. Я пытался использовать файловые вызовы ввода / вывода, но у меня не было способа сделать эту работу. Любые советы высоко ценится.

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); //readwrite(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);
}

0

Решение

Вы не можете читать файл, если открываете его только для записи:

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

Вам нужно открыть его для чтения, в вашем случае O_RDONLY, если вы не хотите ничего в него записывать (иначе O_RDWR).

Кстати, размеры вашего буфера нечетные (257), обычно один выделяет буферы в степени двух (256).

ОБНОВИТЬ:

Имейте в виду, что чтение не обязательно завершает строки строкой с нулевым символом! Используйте cnt вместо strlen (буфер) для записи, но проверьте, чтобы < 0 (ошибка) и == 0 (конец файла) раньше. Возможно, вы захотите сделать это в цикле, если ваши файлы могут иметь произвольный размер (то есть, возможно, больше, чем буфер).

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]