2016-05-04 17 views
0

シンプルなTCPサーバーの機能に関するアドバイスを探していました。ファイルI/O - ファイルの内容を表示

第3の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

書き込み専用として開いているファイルディスクリプタからの読み取りを試みています。 – mausik

答えて

2
あなただけの書き込みのためにそれを開く場合は、ファイルを読み込むことができません

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

あなたが何かを書きたくない場合は、あなたのケースでO_RDONLY、読書のためにそれを開く必要があります(それ以外はO_RDWR)。

ところでバッファサイズは奇数(257)ですが、通常は2の累乗(256)でバッファを割り当てます。

UPDATE:

は、リードは必ずしも文字列をNULLで終了しないことに注意して!書き込みにはstrlen(バッファ)の代わりにcntを使いますが、前に<(エラー)と== 0(ファイルの終わり)であることを確認してください。あなたのファイルが任意のサイズ(すなわち、バッファよりも大きい可能性がある)を持つことができる場合は、これをループで行うことができます。

+0

ありがとう!サイズも固定! –

+0

@VictorAmaro追加情報を追加しました。 – Aconcagua

+0

P.S.:あなたが私の答えを気に入ったら、それを受け入れると素晴らしいジェスチャになるでしょう... – Aconcagua

関連する問題