こんにちは私は非常に単純なウェブサーバーを書こうとしています。どんなリクエストにも同じシンプルなウェブページに応答します。コードの断片は次のとおりです。
while(1) {
if ((newFd = accept(s, (struct sockaddr *) &clientAddr, &sockAddrSize)) == ERROR) {
printf("error accept\n");
close(s);
return;
}
pid = fork();
if(pid == 0) {
handle_request(newFd);
close(newFd);
return;
}
}
そして、handlerequset関数は次のとおりです。
void handle_request(int newFd) {
int readBytes;
int sendBytes;
readBytes = recv(newFd, buffer, BUFFSIZE, 0);
sendBytes = send(newFd, page, strlen(page), 0);
printf("I have send %d B out of %d B\n", sendBytes, strlen(page));
}
ページが単純なグローバル変数である場合:
char * page = "HTTP / 1.0 200 OK \ r \ nContent-Type:text / html \ r \ n \ r \n<h1>こんにちは</h1>\ r \ n";
何が起こるかというと、そのブラウザは待機していて(データを受信しているようで、タブの円が回転しているようです)、何も表示しません(FirefoxとChromiumを試しました)。(accept()を使用して)メインプロセスを強制終了した後でのみ、ページが表示されます。
どこが問題になるのかわかりませんが、正しくやっていると思います。新しいプロセスの場合は、応答を送信し、acceptによって返された記述子を閉じて子を閉じます。