Как исправить ошибку сегмента в программировании сокетов Unix? - PullRequest
0 голосов
/ 30 мая 2019

Я не могу найти, где происходит ошибка сегмента в этом исходном коде.

Я делаю unix http сервер на языке C. используя pthread и функцию ответа (в этом коде refered ())

Я попытался проверить размеры буфера (заголовки, запросы, файл, путь). и изменил pthread на fork (), но это не имеет значения.

Это хорошо работало, когда я использовал свои тестовые html-файлы. но он ломается в неожиданные времена.

while (1)
    {
        new_socket = (int *)malloc(sizeof(int));
        if ((*new_socket = accept(create_socket, (struct sockaddr *)&address, &addrlen))==-1){
            perror("accept");
            exit(1);
        }
        pthread_create(&tid, NULL, threadfunc, (void*)new_socket);
        pthread_detach(tid);
    }

это принять участие в main ().

    recv(*new_socket, buffer, 1024, 0);
    printf("%s\n", buffer);
    strcpy(getPath,basicpath);

    strtok(buffer," ");
    strcpy(openfilename,strtok(NULL," "));

    if(strcmp(openfilename,"/") == 0)
        strcpy(openfilename,"/index.html");

    strcat(getPath,openfilename);

    refered(*new_socket,getPath);

    free(vargp);
    return NULL;
    if(((fd = open(filename, O_RDONLY)) < -1) || (fstat(fd, &filestat) < 0))
    {
        printf("Error in measuring the size of the file\n");
    }
    else
        sprintf(filesize, "%zd", filestat.st_size);

    if((fp = fopen(filename,"r")) ==  NULL)
    {
        strcpy (header_buff, "HTTP/1.1 404 Not Found\r\nContent-Length: 0\r\nContent-Type: text/plain\r\nConnection: keep-alive\r\n\r\n");
        write (ns, header_buff, strlen(header_buff));
    }
    else
    {
        strcpy (header_buff, "HTTP/1.1 200 OK\r\nContent-Length: ");
        strcat (header_buff, filesize);
        strcat (header_buff, "\r\nContent-Type: */* \r\nConnection: keep-alive\r\n\r\n");
        fread (file_buff, sizeof(char), filestat.st_size + 1, fp);
        write (ns, header_buff, strlen(header_buff));
        write (ns, file_buff, filestat.st_size);
        fclose(fp);
    }
    close(ns);

и это часть ответа.

Я хочу найти, где происходит ошибка сегментации (сбрасывается ядро).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...