我用LinuxC语言写Http服务器,浏览器访问时终端出现Segmentation fault (core dumped),并且访问失败


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/epoll.h>

void http_parse_request_cmd(char *buf, char *file_name, char *suffix);
char*http_get_type_by_suffix(const char*suffix);
int fsize(FILE *fp);
struct doc_type{
char*suffix;
char*type;};
struct doc_type file_type[]=
{
{"html","text/html"},
{"ico","image-xicon"},
{NULL,NULL}};
char*http_res_hdr_tmpl="HTTP/1.1 200 OK\nServer: bianchengbang\n"
"Accept-Ranges: bytes\nContent-Length: %d\nConnection: closed\n"
"Content-Type: %s\n\n";
int main(){

int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr =  inet_addr("192.168.137.128");
serv_addr.sin_port = htons(1234);
int isbind=bind(serv_sock, (struct sockaddr*)&serv_addr,sizeof(serv_addr));



if (listen(serv_sock, 20) == -1) {
printf("listen errno\n");
close(serv_sock);
return 0;
}
int epfd=epoll_create(50);
struct epoll_event event;
struct epoll_event* ep_events=malloc(sizeof(struct epoll_event) * 50);

event.events = EPOLLIN;
event.data.fd = serv_sock;
epoll_ctl(epfd, EPOLL_CTL_ADD, serv_sock, &event);
while(1){
int event_cnt = epoll_wait(epfd, ep_events, 50, -1);
if (event_cnt == -1) {
printf("epoll_wait() errno\n");
break;
}
for (int i = 0; i < event_cnt; i++) {
if (ep_events[i].data.fd == serv_sock) {

struct sockaddr_in clnt_addr;
socklen_t adr_sz=sizeof(clnt_addr);
int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &adr_sz);
event.events = EPOLLIN;
event.data.fd = clnt_sock;
epoll_ctl(epfd, EPOLL_CTL_ADD, clnt_sock, &event);
}
else{
char buf[300]={0};
memset(buf, 0, 300);
int num=read(ep_events[i].data.fd, buf, 100);
if(num>0){

char file_name[100]={0};
memset(file_name, 0, 100);
char suffix[100]={0};
memset(suffix, 0, 100);
http_parse_request_cmd(buf, file_name, suffix);
FILE *fp;
if((fp = fopen(file_name, "rb"))==NULL){
printf("服务器不存在%s文件",file_name);
fp=fopen("errno.html", "rb");
memset(suffix, 0, 100);
strcpy(suffix, "html");
}
else{
printf("服务器存在%s文件,发送中...",file_name);
}
int n=fsize(fp);
char*type=http_get_type_by_suffix(suffix);
memset(buf, 0, 300);
sprintf(buf,http_res_hdr_tmpl,n,type);
write(ep_events[i].data.fd,buf,300);
memset(buf, 0, 300);
fread(buf, 1,100,fp);
write(ep_events[i].data.fd,buf,100);
shutdown(ep_events[i].data.fd,SHUT_WR);
fclose(fp);

}
else{
epoll_ctl(epfd, EPOLL_CTL_DEL, ep_events[i].data.fd, NULL);
close(ep_events[i].data.fd);}
}
}
}
close(serv_sock);
close(epfd);
return 0;
}
int fsize(FILE *fp){
    int n;
    fpos_t fpos;  
    fgetpos(fp, &fpos);  
    fseek(fp, 0, SEEK_END);
    n = ftell(fp);
    fsetpos(fp,&fpos);  
    return n;
}
void http_parse_request_cmd(char *buf, char *file_name, char *suffix)
{
int file_length = 0, suffix_length = 0;
char *begin = NULL, *end = NULL, *bias = NULL;
begin = strchr(buf, ' ');
begin += 1;
end = strchr(begin, ' ');
*end = 0;
file_length = end - begin - 1;
memcpy(file_name, begin + 1, file_length);
file_name[file_length] = 0;
bias = strrchr(begin, '/');
suffix_length = end - bias;
if (*bias == '/')
{
bias++;
suffix_length--;
}
if (suffix_length > 0)
{
begin = strchr(file_name, '.');
if (begin)
strcpy(suffix, begin + 1);
}
}
char*http_get_type_by_suffix(const char*suffix)
{int i;
for(i=0;file_type[i].suffix;i++){
if(!strcmp(file_type[i].suffix,suffix))
return file_type[i].type;
}
return NULL;
}
用printf调试也输出不了,浏览器访问文件,终端就出现Segmentation fault (core dumped)


用gdbserver调试看看吧,不然不好判断是哪里的问题。实在不想麻烦那就每一句代码都printf打印一下。

gdb+gdbserver远程调试技术(一)——调试环境搭建_雪狼的博客-CSDN博客_gdbserver远程调试 gdbgdbserver调试技术 https://blog.csdn.net/zhaoxd200808501/article/details/77838933

你这是在裸写http协议的server?好歹找个轮子用用,比如libevent啥的,徒手从tcp流解析http包,开发成本太高,后期维护起来也是要命

Linux程序运行出现Segmentation fault (core dumped)的通用解决方法_夜雨鸦的博客-CSDN博客 之前v4l-test编译后运行时出现错误Segmentation fault (core dumped),段错误(核心已转储),因为代码不同,错误原因不一样,导致解决方法也不一样,所以找了许多都没有找到好的解决方法,最终在一篇博客发现这类问题的通用解决方法,博客地址如下:https://www.cnblogs.com/kuliuheng/p/11698378.html1 问题原因... https://blog.csdn.net/qq_38892528/article/details/103870163


 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/epoll.h>
void http_parse_request_cmd(char *buf, char *file_name, char *suffix);
char*http_get_type_by_suffix(const char*suffix);
int fsize(FILE *fp);
struct doc_type{
char*suffix;
char*type;};
struct doc_type file_type[]=
{
{"html","text/html"},
{"ico","image-xicon"},
{NULL,NULL}};
char*http_res_hdr_tmpl="HTTP/1.1 200 OK\nServer: bianchengbang\n"
"Accept-Ranges: bytes\nContent-Length: %d\nConnection: closed\n"
"Content-Type: %s\n\n";
int main(){
int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr =  inet_addr("192.168.137.128");
serv_addr.sin_port = htons(1234);
int isbind=bind(serv_sock, (struct sockaddr*)&serv_addr,sizeof(serv_addr));
 
if (listen(serv_sock, 20) == -1) {
printf("listen errno\n");
close(serv_sock);
return 0;
}
int epfd=epoll_create(50);
struct epoll_event event;
struct epoll_event* ep_events=(struct epoll_event*)malloc(sizeof(struct epoll_event) * 50);
event.events = EPOLLIN;
event.data.fd = serv_sock;
epoll_ctl(epfd, EPOLL_CTL_ADD, serv_sock, &event);
while(1){
int event_cnt = epoll_wait(epfd, ep_events, 50, -1);
if (event_cnt == -1) {
printf("epoll_wait() errno\n");
break;
}
for (int i = 0; i < event_cnt; i++) {
if (ep_events[i].data.fd == serv_sock) {
struct sockaddr_in clnt_addr;
socklen_t adr_sz=sizeof(clnt_addr);
int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &adr_sz);
event.events = EPOLLIN;
event.data.fd = clnt_sock;
epoll_ctl(epfd, EPOLL_CTL_ADD, clnt_sock, &event);
}
else{
char buf[300]={0};
memset(buf, 0, 300);
int num=read(ep_events[i].data.fd, buf, 100);
if(num>0){
char file_name[100]={0};
memset(file_name, 0, 100);
char suffix[100]={0};
memset(suffix, 0, 100);
http_parse_request_cmd(buf, file_name, suffix);
FILE *fp;
if((fp = fopen(file_name, "rb"))==NULL){
printf("服务器不存在%s文件",file_name);
fp=fopen("errno.html", "rb");
memset(suffix, 0, 100);
strcpy(suffix, "html");
}
else{
printf("服务器存在%s文件,发送中...",file_name);
}
int n=0;
if(fp)
{
    n = fsize(fp);
    char*type=http_get_type_by_suffix(suffix);
    memset(buf, 0, 300);
    if(n>300)n=300;
    sprintf(buf,http_res_hdr_tmpl,n,type);
    write(ep_events[i].data.fd,buf,strlen(buf));
    memset(buf, 0, 300);
    fread(buf, 1,n,fp);
    write(ep_events[i].data.fd,buf,n;
    fclose(fp);
}
}
else{
epoll_ctl(epfd, EPOLL_CTL_DEL, ep_events[i].data.fd, NULL);
close(ep_events[i].data.fd);}
}
}
}
close(serv_sock);
close(epfd);
return 0;
}
int fsize(FILE *fp){
    int n;
    fpos_t fpos;  
    fgetpos(fp, &fpos);  
    fseek(fp, 0, SEEK_END);
    n = ftell(fp);
    fsetpos(fp,&fpos);  
    return n;
}
void http_parse_request_cmd(char *buf, char *file_name, char *suffix)
{
int file_length = 0, suffix_length = 0;
char *begin = NULL, *end = NULL, *bias = NULL;
begin = strchr(buf, ' ');
begin += 1;
end = strchr(begin, ' ');
*end = 0;
file_length = end - begin - 1;
memcpy(file_name, begin + 1, file_length);
file_name[file_length] = 0;
bias = strrchr(begin, '/');
suffix_length = end - bias;
if (bias && *bias == '/')
{
bias++;
suffix_length--;
}
if (suffix_length > 0)
{
begin = strchr(file_name, '.');
if (begin)
strcpy(suffix, begin + 1);
}
}
char*http_get_type_by_suffix(const char*suffix)
{int i;
for(i=0;file_type[i].suffix;i++){
if(!strcmp(file_type[i].suffix,suffix))
return file_type[i].type;
}
return NULL;
}
 

另外,在程序运行目录下放一个errno.html返回文件不存在时的html页面。不然会存在返回错误。
如有帮助,请采纳!

参考这个, 望 采纳, 谢谢

Segmentation fault (core dumped)多为内存不当操作造成。 空指针、野指针的读写操作,数组越界访问,破坏常量等。 如最近的势能图代码中的链表操作,对链表的新增和释放包括赋值等等,如出现不当操作都有可能造成程序崩溃。

阿里云的解决方案

Linux C-完美解决segmentation fault (core dumped)-阿里云开发者社区 在Linux下进行C语言编程时,遇到一个错误,网上说的都很复杂,看都看不懂,其实就是你对指针进行直接操作之前,没有对它进行分配地址空间。 所以在运行的时候,它不知道在那里操作(比如赋值,取值),所以才报了这个错误。 https://developer.aliyun.com/article/649819

解决办法
ulimit -a
使用上面命令查看系统的core功能是否打开:
然后看看算术有没有异常呗

linux下运行c语言程序报Segmentation Fault错误原因总结即解决办法汇总_Tasdily的博客-CSDN博客 最近在项目上遇到了Segmentation Fault的错误,一直调试不出来是哪里出了问题,对于刚接触嵌入式的,也不知道该如何去调试一个项目,定位内存问题,纠结了好几天,好阿红整理下自己的思路。从头开始。  以下内容只为整理来自己使用的,大多来源于网络,感谢大家的分享:  http://www.cnblogs.com/no7dw/archive/2013/02/20/2918372.html  http://blog.chinaunix.net/uid-20780355-id-538814.ht https://blog.csdn.net/weixin_42096901/article/details/106559761