1

マルチスレッド Web サーバーを作成しようとしていますが、単純なサーバーへの各 HTTP 要求 (Web ページ) からファイル名を取得する方法がわかりません。また、これらの各ファイルのサイズについても懸念しています。何か案が?

server.c ファイルのメインは次のとおりです。

     int main(int argc, char *argv[])
     {
        int listenfd, connfd, port, clientlen;
        struct sockaddr_in clientaddr;

        getargs(&port, argc, argv);

        listenfd = Open_listenfd(port);
        thread_pool_init();    

        for(;;){
                pthread_mutex_lock(&pool_lock);
                while(buf_count == request_limit)
                        pthread_cond_wait(&signal_worker, &pool_lock);
                clientlen = sizeof(clientaddr);
                connfd = Accept(listenfd, (SA *)&clientaddr, (socklen_t *) &clientlen);

        //get/parse html file name here 
        //get file size using stat

                put(connfd);

                pthread_cond_signal(&signal_worker);
                pthread_mutex_unlock(&pool_lock);
        }

HTTP リクエストを server.c ファイルに送信する client.c の open_connection コードは次のようになります。

void * open_connection( ){

        clientfd = Open_clientfd(host, port);

        clientSend(clientfd, filename);

        pthread_mutex_lock(&lock);
        clientPrint(clientfd);
        pthread_mutex_unlock(&lock);

        Close(clientfd);
        sem_post(&cond);
        return NULL;
}



 //Send an HTTP request for the specified file 

void clientSend(int fd, char *filename)
{
  char buf[MAXLINE];
  char hostname[MAXLINE];

  Gethostname(hostname, MAXLINE);

  //Form and send the HTTP request 
  sprintf(buf, "GET %s HTTP/1.1\n", filename);
  sprintf(buf, "%shost: %s\n\r\n", buf, hostname);
  Rio_writen(fd, buf, strlen(buf));
}
4

1 に答える 1