0

我正在制作一个简单的 HTTP 网络服务器,这是代码的相关部分:

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         }

我以为这就足够了,但事实并非如此。我可以在这里看到两件事是错误的:

  • 我的进入条件,errno == EACCES。由于这是一个多进程网络服务器,这是否是检查 errno 值的“安全”且正确的方法?有没有更好的办法?
  • 我还需要发送()“301 永久移动\n位置:”吗?这似乎是错误的,看到我想要的东西根本没有被移动——我只是无法访问它。

我敢打赌我的错误是第一个错误,因为它似乎根本没有涉及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.

如果要使用多线程,请确保使用-pthreaderrno声明为线程本地的选项进行编译。

请注意,编译器选项 -pthread不同于libpthread通过给出链接 -lpthread器选项来告诉链接器链接。

于 2013-10-03T14:32:13.863 回答