Я искал несколько советов по функции для простого 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);
}
Вы не можете читать файл, если открываете его только для записи:
fd = open(token[1], O_WRONLY); //open
Вам нужно открыть его для чтения, в вашем случае O_RDONLY, если вы не хотите ничего в него записывать (иначе O_RDWR).
Кстати, размеры вашего буфера нечетные (257), обычно один выделяет буферы в степени двух (256).
ОБНОВИТЬ:
Имейте в виду, что чтение не обязательно завершает строки строкой с нулевым символом! Используйте cnt вместо strlen (буфер) для записи, но проверьте, чтобы < 0 (ошибка) и == 0 (конец файла) раньше. Возможно, вы захотите сделать это в цикле, если ваши файлы могут иметь произвольный размер (то есть, возможно, больше, чем буфер).
Других решений пока нет …