2013-02-26 48 views
-2

我想用C編寫一個web服務器,我的代碼此時暫時不在,我不知道爲什麼。這似乎與我的strcats有關,但就我所能得到的那些而言。我已經發布了代碼和gdb輸出。任何幫助是極大的讚賞。在strcat中編程segfaulting()

*** CODE ** *

/* web-server.c */ 

    #include <arpa/inet.h> 
    #include <netdb.h> 
    #include <sys/types.h> 
    #include <sys/socket.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <unistd.h> 

    #define BUFLEN 1500 
    #define BACKLOG 10 

    static int server_socket(int port) { 
int fd; 
struct sockaddr_in servaddr; 

if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ 
    perror("Unable to create socket"); 
    return -1; 
} 
printf("created socket\n"); 
servaddr.sin_family = AF_INET; 
servaddr.sin_addr.s_addr = INADDR_ANY; 
servaddr.sin_port = htons(port); 

if (bind(fd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) { 
    perror("Unable to bind to port"); 
    return -1; 
} 
printf("binding completed\n"); 
if (listen(fd, BACKLOG) == -1){ 
    perror("Unable to listen for connections"); 
    return -1; 
} 
printf("socket setup\n"); 
return fd; 

    } 

    static char *html_request(char *request) { 
char request_code[3], url[BUFLEN], http_code[BUFLEN]; 
printf(request); 
printf("\n"); 
sscanf(request, "%3s %s %s", request_code, url, http_code); 
return url; 
    } 


    int main() { 
int connfd, servfd, rlen, i, eof; 
int content_length = 0; 
char buf[BUFLEN]; 
struct sockaddr_in saddr; 
char *response; 
char *read_buffer = malloc(1); 
    char *response200 = "HTTP/1.1 200 OK\nContent-Type: text/html\nConnection: close\nConnection-Length: "; 
char *response404 = "HTTP/1.1 404 Not Found\nContent-Type: text/html\nConnection: close\nConnection-Length: "; 
FILE *in; 
char buffer[1500], content_buffer[5]; 
char *headers = malloc(BUFLEN); 
char *output = malloc(BUFLEN); 
socklen_t saddr_len = sizeof(saddr); 
servfd = server_socket(8080); 
printf("before connection\n"); 
if ((connfd = accept(servfd, (struct sockaddr *)&saddr, &saddr_len)) == -1) { 
    perror("Unable to accept connection"); 
    return -1; 
} 
else { 
printf("Accept connection\n"); 

} 
if ((rlen = read(connfd, buf, BUFLEN)) > 0) { 
    realloc(read_buffer,rlen); 
    for (i = 0; i < rlen; i++){ 
     printf("%c", buf[i]); 
     read_buffer[i] = buf[i]; 
    } 
    printf("\n"); 

} 
printf("IMMA BEAST!\n"); 
response = html_request(read_buffer); 
printf(response); 

if (strcmp(response, "/index.html") == 0){ 
    printf("\nMatches!"); 
    in = fopen("index.txt", "r"); 
    if (in == NULL){ 
     printf("Read fail!"); 
    } 
    while ((eof = fread(buffer, 1, 296, in)) > 0){ 
     content_length = content_length + 1; 
    } 
    snprintf(content_buffer, 5, "%d" ,content_length); 
    headers = strcat(response200, content_buffer); 
} 
else{ 
    printf("\nFails!"); 
    in = fopen("index-error.txt", "r"); 
    if (in == NULL){ 
     printf("Read fail!"); 
    } 
    while ((eof = fread(buffer, 1, 300, in)) > 0){ 
     content_length = content_length + 1; 
    } 
    snprintf(content_buffer, 5, "%d" ,content_length); 
    headers = strcat(response404, content_buffer); 
} 
fclose(in); 
output = strcat(headers, buffer); 
write(connfd, output, BUFLEN); 
close(connfd); 
free(read_buffer); 
free(headers); 
free(output); 

return 0; 

}

* GDB OUTPUT *

Program received signal SIGSEGV, Segmentation fault. 
0x0000003d4647eff0 in strcat() from /lib64/libc.so.6 
(gdb) where 
#0 0x0000003d4647eff0 in strcat() from /lib64/libc.so.6 
#1 0x0000000000400ecd in main() 
(gdb) n 
Single stepping until exit from function strcat, 
which has no line number information. 

Program terminated with signal SIGSEGV, Segmentation fault. 
The program no longer exists. 

回答

8

這是不正常都:

strcat("HTTP/1.1 404 Not Found\nContent-Type: text/html\nConnection: close\nConnection-Length: ", content_buffer); 

strcat()追加的第二個參數是第一個!第一個參數是一個文字字符串,它不能被修改。 C允許編譯的唯一原因是不幸的事實,即舊代碼依賴於文字字符串類型爲char[]而不是const char[]

+0

把這個放入char * response200,然後用strcat(response200,content_buffer),然後得到一個段錯誤 – user2039272 2013-02-26 13:11:35

+2

讓我猜,你做了不爲目標字符串分配任何內存。我建議閱讀一些關於strcat和C字符串處理的教程,但同時,Jeremy在本頁其他地方的回答也可能有幫助! – 2013-02-26 13:14:01

+1

字符串字符串的類型是'char []'而不是'char *'。 – 2013-02-26 13:17:16

0

http://www.manpagez.com/man/3/strcat/

您有合適的尺寸,以你的malloc第一串的第一串+第二串+ 1

http://www.manpagez.com/man/3/malloc/

喜歡的東西的長度(長度:

char *str; 
int len = (strlen("HTTP/1.1 200 OK\nContent-Type: text/html\nConnection: close\nConnection-Length: ") + strlen(content_buffer)); 

str = malloc((len + 1) * sizeof(char)); 
bzero(str, len); 
strcpy(str, "HTTP/1.1 200 OK\nContent-Type: text/html\nConnection: close\nConnection-Length: "); 
strcat(str, content_buffer); 
str[len] = 0; 
+0

ive添加了這個代替我的代碼,但它仍然給我一個段錯誤但是它比以前更進一步 – user2039272 2013-02-26 13:28:06

+0

原因是什麼現在的段錯誤? – Jeremy 2013-02-26 13:32:26