私はクライアントからのGETリクエストを提供するC言語の基本ウェブサーバを実装しました。問題は、HTMLページを送信しないことです。 CウェブサーバからウェブブラウザへHTMLページを送る方法
while(1){
if((temp_sock[id] = accept(sockfd, (t_sockaddr*)address, &address_size))==-1){
perror("Accepting Failure: ");
pthread_mutex_lock(&lock);
fprintf(logfile, "Accepting error: %d\n", localfd);
pthread_mutex_unlock(&lock);
exit(1);
}
else{
pthread_mutex_lock(&lock);
fprintf(logfile, "\nAccepting Success");
pthread_mutex_unlock(&lock);
}
if (temp_sock[id]> 0){
pthread_mutex_lock(&lock);
fprintf(logfile, "\nClient is connected");
pthread_mutex_unlock(&lock);
}
recv(temp_sock[id] , buf, buffsize, 0);
pthread_mutex_lock(&lock);
fprintf(logfile, "\nyou recieved : %s\n ", buf);
pthread_mutex_unlock(&lock);
if((resource=analyze(buf))==NULL){ /*analyze - implements basic security and searches files on a disc*/
printf("\nres is NULL");
write(temp_sock[id], "HTTP/1.1 200 OK\n", 16);
write(temp_sock[id], "Content-length: 50\n", 19);
write(temp_sock[id], "Content-Type: text/html\n\n", 25);
write(temp_sock[id], "<html><body><H1>404 Not Found</H1></body></html>", 50);
}
else{
while(fgets(message, 150, resource)!=NULL){
write(temp_sock[id], "HTTP/1.1 200 OK\n", 16);
write(temp_sock[id], "Content-length: 151\n", 19);
write(temp_sock[id], "Content-Type: text/html\n\n", 25);
write(temp_sock[id], message, 151); //here problems start
}
fclose(resource);
}
close(temp_sock[id]);
}
}
この
はちょうど私は、テキストの複数行(例えばWikipediaの記事)を含むページを送信する場合、すべてが時点まで正常に動作しますので、私は、全体のコードをポストいけない、糸のループを受け入れていますファイルを読み込もうとすると、Webサーバーはただ停止します。しかし、ファイルにのみ<html><body><H1>Hello! How are you?</H1></body></html>
サーバーが適切な方法でそれを送信する場合。 ありがとうございます。
[OK]を、おかげで、私は約500行を含む内部の記事とページを持っている場合、私は割り当て、その後、一度にすべてを送信すべきかそれを部品に分けることはできますか? – TeamBeam
@TeamBeamそれはあなた次第です。ただし、複数の書き込みに分割する場合は、より大きなバッファサイズを使用します。これは150バイトではなく、64 KBのオーダーで行われます。 – duskwuff
@TeamBeamでは、クライアントに、(一度だけ送信する)ヘッダー内のファイルの全体サイズを伝え、サーバーに適したブロックサイズでデータを読み取り、送信します。クライアントは、1MBファイルを500個の2KBブロックとして読み込むことを知る必要はなく、1MBが到着したストリームだけが表示されます。 – lockcmpxchg8b