0

私は単純な HTTP Web サーバーを作成しています。これはコードの関連部分です。

179         stat(path, &rd_perm); /* path contains the full path to the original file request */
180         if(errno == EACCES){ /* We don't have permissions to view the file... */
181                 printf("======> NO READ PERMISSIONS FOR FILE!\n"); /* sanity check */
182                 /* Send the client a 403 Forbidden */
183
184                 send(clients[n], "HTTP/1.0 403 Forbidden\r\n\r\n", 26, 0);
185                 strcpy(path, home_dir);
186                 strcpy(&path[strlen(home_dir)], FORBIDDEN);
187
188                 /* After changing the pathname to the "forbidden" page, write that page to the client socket. */
189
190                 if( (fd = open(path, O_RDONLY)) != -1){
191                         while( (bytes_read = read(fd, data_to_send, 1024)) > 0){
192                                 write(clients[n], data_to_send, bytes_read);
193                         }
194                 }
195         }

これで十分かと思いましたが、そうではありません。ここで 2 つのことが間違っていることがわかります。

  • 私のエントリー条件は、errno == EACCES. これはマルチプロセス Web サーバーであるため、errno の値をチェックする「安全な」正しい方法でしょうか? より良い方法はありますか?
  • 「301 Moved Permanently\nLocation:」を send() する必要はありますか? これは間違っているようです。私が望んでいたものがまったく動かされていないのを見ると、アクセスできませんでした。

私のエラーが最初のものであることに賭けたいと思いますif。任意の提案をいただければ幸いです。

4

1 に答える 1

0

errnostat()失敗した場合にのみ設定されます。

したがって、コードを次のように変更します。

    int result = stat(path, &rd_perm); /* path contains the full path to the original file request */
    if ((-1 == result) && (errno == EACCES)) { /* We don't have permissions to view the file... */

各プロセスには、独自の のインスタンスがありerrnoます。

-pthreadマルチスレッド化する場合は、オプションを使用してコンパイルしerrno、スレッドローカルとして宣言されていることを確認してください。

コンパイラ オプションは、リンカーに linker-option-pthread指定してリンクするように指示することとは異なることに注意してください。libpthread -lpthread

于 2013-10-03T14:32:13.863 に答える