ソケット クライアント プログラムを作成してアクセスするのが通常ですが、telent を使用してアクセスすることも通常ですが、ブラウザがクライアントとしてアクセスすると、エラーが直接報告され、while ループに入りません。なぜそうなるのですか?
ブラウザ アクセス 127.0.0.1:8899
サーバー プログラムが直接終了し、エラーが報告されました: セグメンテーション フォールト (コア ダンプ)
サーバーコードはおそらく次のようになります
int main(int argc, char *argv[]){
if(argc != 2){
err_msg("使用法: ./studyHttpd \n");
}
struct sockaddr_in サーバー_sock、クライアント_sock;
int sockfd、client_fd;
int sin_size;
pthread_t ntid;
if(-1 == (sockfd = ソケット(AF_INET, SOCK_STREAM, 0))) err_exit("ソケット");
printf("ソケット ID = %d\n", sockfd);
サーバー_sock.sin_family = AF_INET;
サーバー_sock.sin_port = htons(PORT);
サーバー_sock.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_sock.sin_zero), 8);
int i = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
if(-1 == binding(sockfd, (struct sockaddr *)&server_sock, sizeof(struct sockaddr))) err_exit("bind");
printf("バインド成功\n");
if(-1 == listen(sockfd, MAX_QUE_CONN_NM)) err_exit("listen");
printf("リスニング ポート = %d\n", PORT);
sin_size = sizeof(client_sock);
/*ブラウザはこのステップをまったく実行しません。他のクライアントは正常に動作します*/
while(1){
if(-1 == (client_fd = accept(sockfd, (struct sockaddr *) &client_sock, &sin_size))) err_exit("accept");
if(pthread_create(&ntid, NULL, (void *)handle, &client_fd) != 0) err_exit("pthread_create");
}
閉じる(sockfd);
0を返します。
}
ブラウザは http プロトコルを使用し、ソケットは通常 tcp/ip プロトコルを使用します
http プロトコルには特別なヘッダーがあり、それがなければ当然アクセスできません。