Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
 Аватар для greenEYE
65 / 37 / 3
Регистрация: 30.11.2011
Сообщений: 109

Не выводится ответ сервера браузеру

24.10.2013, 19:27. Показов 1993. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу простенький http сервер,реализующий get запрос. Запрос от браузера сервер распознаёт без проблем,а вот выводить html,полученный от сервера,браузер не хочет,в чём может быть проблема?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
 
char *getfile_html_code(char *filepath);
int check_file_on_exist();
 
int main()
{
  int server_sockfd, client_sockfd;
  int server_len, client_len;
  struct sockaddr_in server_address;
  struct sockaddr_in client_address;
 
  server_sockfd = socket(AF_INET,SOCK_STREAM,0);
  server_address.sin_family = AF_INET;
  server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
  server_address.sin_port = htons(6565);
  server_len = sizeof(server_address);
  bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
  
  listen(server_sockfd, 5);
  signal(SIGCHLD,SIG_IGN);
 
  while(1)
  {
    char msg[100];
    char path[50], *ppath , *pmsg;
    ppath = path;
    pmsg = msg;
 
    printf("server waititng \n");
  
    client_len = sizeof(client_address);
    client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
    if (fork() == 0) {
        printf("connection is init\n");
        read(client_sockfd, msg, sizeof(msg));
        printf("server get this:\n%s\n", msg);
 
        if (strncmp("GET", msg, 3) == 0)
        {
          printf("this is GET query\n");
          pmsg = pmsg + 5;
 
          while(*pmsg != ' ')
          {
            *ppath++ = *pmsg++;
          }
          printf("need file: %s\n", path);
 
          if(check_file_on_exist(path) == 0)
          {
            printf("file is exists\n");
            write(client_sockfd,"HTTP/1.1 200 OK\n",24);
            write(client_sockfd,"Content-Type: text/html\n",23);
            write(client_sockfd,"Content-Length: 48\n",23);
            write(client_sockfd,"Connection: close\n\n",21);
            write(client_sockfd,"<html><body><h1>HELLO WORLD!</h1></body></html>",48);
 
          }
          else
          {
            printf("file isn't exists\n");
            write(client_sockfd,"HTTP/1.1 404 Not Found\n",24);
            write(client_sockfd,"Content-Type: text/html\n",23);
            write(client_sockfd,"Content-Length: 48\n",23);
            write(client_sockfd,"Connection: close\n\n",21);
            write(client_sockfd,"<html><body><h1>404 Not Found</h1></body></html>",48);
          }
        }
 
        close(client_sockfd);
        exit(EXIT_SUCCESS);
    }
    else {
       close(client_sockfd);
    }
  }
}
 
int check_file_on_exist(char *filepath)
{
  FILE *fo;
 
  fo = fopen(filepath,"r");
  if (fo == NULL)
  {
    return 1;
  }
  return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.10.2013, 19:27
Ответы с готовыми решениями:

Ajax -ответ сервера в формате XML в IE сразу выводится в окно
Не могу понять.В FF такой проблемы нет.Но в IE когда получает ответ в формате XML то вместо того чтобы его передать скрипту обработки...

Различный ответ браузеру и приложению
Всем привет! Кто - то может подсказать, что я не правильно делаю, и как выйти из этой ситуации, по-тому что я в тупике: Необходимо...

Реализация WEB-сервера (HTTP), сделать поставку браузеру html страниц
Здравствуйте, уважаемые разработчики. У меня есть задача реализовать систему компьютерного тестирования учащихся. Для проведения...

19
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
24.10.2013, 20:45
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

У меня работает (проверил через telnet, и мозиллой).
Поправил только
C
1
2
3
4
5
6
7
          pmsg = pmsg + 4;
 
          while(*pmsg != ' ')
          {
            *ppath++ = *pmsg++;
          }
          *ppath=0;
1
 Аватар для greenEYE
65 / 37 / 3
Регистрация: 30.11.2011
Сообщений: 109
24.10.2013, 20:48  [ТС]
gng, а для чего *ppath=0; ?
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
24.10.2013, 20:53
Строка, передаваемая в check_file_on_exist, должна заканчиваться нулем.
1
 Аватар для greenEYE
65 / 37 / 3
Регистрация: 30.11.2011
Сообщений: 109
24.10.2013, 20:55  [ТС]
gng, и да,если сделать pmsg + 4,то путь будет с передним слэшем,типа такого : /index.html и файл index.html не находит,почему исправили?) p.s. - а я тестирую в гугл хром
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
24.10.2013, 21:03
Цитата Сообщение от greenEYE Посмотреть сообщение
gng, и да,если сделать pmsg + 4,то путь будет с передним слэшем,типа такого : /index.html и файл index.html не находит,почему исправили?) p.s. - а я тестирую в гугл хром
Вроде так и должно быть. Сервер по умолчанию ищет index.html в СВОЕМ корневом каталоге

Добавлено через 3 минуты
PS. Если в браузере "http://mysite.ru", то серверу передается
GET / HTTP/1.1
0
 Аватар для greenEYE
65 / 37 / 3
Регистрация: 30.11.2011
Сообщений: 109
24.10.2013, 21:34  [ТС]
gng, ну я просто прописываю в адресной строке localhost:6565/index.html
если оставить ваш вариант с pmsg + 4,то в таком случае сервер получается след-ий запрос :
GET /favicon.ico HTTP/1.1
Host: localhost:6565

то есть нужен ей не index.html =/
0
 Аватар для greenEYE
65 / 37 / 3
Регистрация: 30.11.2011
Сообщений: 109
24.10.2013, 21:46  [ТС]
gng, вернул + 5 получил след-ее :
server get this:
GET /index2.html HTTP/1.1
Host: localhost:6565
Connection: keep-alive
Cache-Control: max-age=0
A
this is GET query
need file: index2.html
file isn't exists
server get this:
GET /favicon.ico HTTP/1.1
Host: localhost:6565

видимо после получения 404 not found пытается какую-то иконку ещё получить от сервера
другой браузер что ли попробовать =/ а вот если файл якобы существует,то браузер не выводит html,а пытается скачать файл с ошибкой естессна,тк его нет)
Миниатюры
Не выводится ответ сервера браузеру  
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
24.10.2013, 21:54
http://ru.wikipedia.org/wiki/Favicon
А относительно "/" я имел в виду работу стандартного http сервера. У вашего в зависимости от назначения может быть другая логика.
1
 Аватар для greenEYE
65 / 37 / 3
Регистрация: 30.11.2011
Сообщений: 109
24.10.2013, 22:00  [ТС]
gng, не могли бы описать,как вы тестили серв?) видимо где-то я не то делаю,тк у вас работает,а у меня нет =/
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
24.10.2013, 22:45
Запускаю ваш сервер.
Набираю в браузере существующий вайл http://localhost:6565/home/gg/index.html
Получаю большими буквами
HELLO WORLD!
Набираю несуществующий файл
http://localhost.com:6565/home/gg/inde2.html
Сервер выдает в консоль, что файл не существует, а браузер сообщение, что сервер не найден.
Сваливаю вину на браузер и запрашиваю несуществующий файл в telnet
GET /home/gg/index2.html HTTP/1.1
Получаю сообщение:
<html><body><h1>404 Not Found</h1></body></html>Connection closed by foreign host.
1
 Аватар для greenEYE
65 / 37 / 3
Регистрация: 30.11.2011
Сообщений: 109
24.10.2013, 22:53  [ТС]
gng, ну вот теперь хоть понятно вроде,где я тупил)) я думал просто,что если файл находится в директории,где и исполняемый файл сервера лежит,то можно просто /index.html обращаться,а получается полный путь к файлу надо прописывать?
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
24.10.2013, 23:53
В телнете всегда однозначно.
Браузер иногда не находит сервер (пытается искать по другому адресу), а иногда находит в обоих случаях

Добавлено через 41 минуту
Нашел еще одну ошибку
C
1
2
3
char msg[100];
...
read(client_sockfd, msg, sizeof(msg));
sizeof(msg) - размер указателя. Да и сообщение может превысить 100 байт

Добавлено через 16 минут
PS. sizeof выдаст 100, но этого может не хватить.
1
 Аватар для greenEYE
65 / 37 / 3
Регистрация: 30.11.2011
Сообщений: 109
25.10.2013, 00:21  [ТС]
gng, в общем пока я решил браузер не трогать вообще,раз уж с ним морока такая..а в телнет и у меня всё ок
по поводу msg : ну я просто условное число какое-то взял небольшое,так-то ясно,что один путь к файлу может быть огого какой

Теперь пробую сделать так,что если запрашиваемый файл имеется,то считывалось его содержимое и отправлялось серверу.
видимо я уже засыпаю,тк где-то должна быть очевидная ошибка,которую не могу найти,поскольку даже телнет стал выводить страшные вещи))) :
this is GET query
need file: index.html
file is exists
HTTP/1.1 200 OK
ContentContent-Type: text/htmlContent-Length: 48
ConConnection: close

@��%?Connection closed by foreign host.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
 
#define HTML_SIZE 100
 
void getfile_html_code(char *filepath);
int check_file_on_exist(char *filepath);
 
char html[HTML_SIZE];
 
int main()
{
  int server_sockfd, client_sockfd;
  int server_len, client_len;
  struct sockaddr_in server_address;
  struct sockaddr_in client_address;
 
  server_sockfd = socket(AF_INET,SOCK_STREAM,0);
  server_address.sin_family = AF_INET;
  server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
  server_address.sin_port = htons(6565);
  server_len = sizeof(server_address);
  bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
  
  listen(server_sockfd, 5);
  signal(SIGCHLD,SIG_IGN);
 
  while(1)
  {
    char msg[100];
    char path[50], *ppath , *pmsg;
    ppath = path;
    pmsg = msg;
 
    printf("server waititng \n");
  
    client_len = sizeof(client_address);
    client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
    if (fork() == 0) {
        printf("connection is init\n");
        read(client_sockfd, msg, sizeof(msg));
        printf("server get this:\n%s\n", msg);
 
        if (strncmp("GET", msg, 3) == 0)
        {
          printf("this is GET query\n");
          pmsg = pmsg + 5;
 
          while(*pmsg != ' ')
          {
            *ppath++ = *pmsg++;
          }
          *ppath = 0;
          printf("need file: %s\n", path);
 
          if(check_file_on_exist(path) == 0)
          {
            printf("file is exists\n");
            getfile_html_code(path);
            write(client_sockfd,"HTTP/1.1 200 OK\n",24);
            write(client_sockfd,"Content-Type: text/html\n",23);
            write(client_sockfd,"Content-Length: 48\n",23);
            write(client_sockfd,"Connection: close\n\n",21);
            write(client_sockfd,path,sizeof(path));
          }
          else
          {
            printf("file isn't exists\n");
            write(client_sockfd,"HTTP/1.1 404 Not Found\n",24);
            write(client_sockfd,"Content-Type: text/html\n",23);
            write(client_sockfd,"Content-Length: 48\n",23);
            write(client_sockfd,"Connection: close\n\n",21);
            write(client_sockfd,"<html><body><h1>404 Not Found</h1></body></html>",48);
          }
        }
 
        close(client_sockfd);
        exit(EXIT_SUCCESS);
    }
    else {
       close(client_sockfd);
    }
  }
}
 
int check_file_on_exist(char *filepath)
{
  FILE *fo;
 
  fo = fopen(filepath,"r");
  if (fo == NULL)
  {
    fclose(fo);
    return 1;
  }
  fclose(fo);
  return 0;
} 
 
void getfile_html_code(char *filepath)
{
  FILE *fo;
  char *html_code = html;
  int size = HTML_SIZE;
 
  fo = fopen(filepath,"r");
  while(size-- && fscanf(fo,"%c",html_code++));
  fclose(fo);
}
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
25.10.2013, 18:04
Что на виду:
1. Строку msg надо завершить нулем, тогда "страшные вещи" исчезнут.
2. Длины строк, записывамых в сокет, должны соответствовать реальности.
3. Буфера должны быть достаточных размеров.
0
 Аватар для greenEYE
65 / 37 / 3
Регистрация: 30.11.2011
Сообщений: 109
28.10.2013, 23:52  [ТС]
Собсна,борьба продолжается))
Теперь пытаюсь весь ответ сервера отправлять единой строкой,при этом проверяя,какое значение вернула ф-ция write,чтобы знать,всё ли я записал. Препод посоветовал для тестов использовать не telnet, а wget,то есть тестирую теперь так :
wget localhost:6565/index.html
на что wget выводит :
Распознаётся localhost (localhost)... 127.0.0.1
Подключение к localhost (localhost)|127.0.0.1|:6565... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа... Ошибка чтения (Соединение сброшено другой стороной) в заголовках.
Продолжение попыток.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
 
struct http_procotol
{
  char *header;
  char *mime_type;
  char *connection_stat;
  char *data_length;
  char *server;
  char *body;
};
 
char *getfile_html_code(char *filepath);
int check_file_on_exist(char *filepath);
 
struct http_procotol server_answer;
char *server_answer_msg;
int server_answer_msg_len;
 
int main()
{
  int server_sockfd, client_sockfd;
  int server_len, client_len;
  struct sockaddr_in server_address;
  struct sockaddr_in client_address;
 
  server_sockfd = socket(AF_INET,SOCK_STREAM,0);
  server_address.sin_family = AF_INET;
  server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
  server_address.sin_port = htons(6565);
  server_len = sizeof(server_address);
  bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
  
  listen(server_sockfd, 5);
  signal(SIGCHLD,SIG_IGN);
 
  while(1)
  {
    char msg[100];
    char path[50], *ppath , *pmsg;
    int bytes;
    int written_bytes;
    ppath = path;
    pmsg = msg;
 
    printf("server waititng \n");
  
    client_len = sizeof(client_address);
    client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
    if (fork() == 0) {
        printf("connection is init\n");
        read(client_sockfd, msg, sizeof(msg));
        printf("server get this:\n%s\n", msg);
 
        if (strncmp("GET", msg, 3) == 0)
        {
          printf("this is GET query\n");
          pmsg = pmsg + 5;
 
          while(*pmsg != ' ')
          {
            *ppath++ = *pmsg++;
          }
          *ppath = 0;
          printf("need file: %s\n", path);
 
          if(check_file_on_exist(path) == 0)
          {
            printf("file is exists\n");
            server_answer.header = "HTTP/1.1 200 OK\n";
            server_answer.server = "Server: localhost:6565\n";
            server_answer.mime_type = "Content-Type: text/html; charset=utf-8\n";
            server_answer.connection_stat = "Connection: close\n\n";
            server_answer.body = getfile_html_code(path);
            server_answer.data_length = "Content-Length: ";
            strcat(server_answer.data_length,(char *)strlen(server_answer.body));
            strcat(server_answer.data_length,"\n");
            
            strcat(server_answer_msg,server_answer.header);
            strcat(server_answer_msg,server_answer.server);
            strcat(server_answer_msg,server_answer.mime_type);
            strcat(server_answer_msg,server_answer.data_length);
            strcat(server_answer_msg,server_answer.connection_stat);
            strcat(server_answer_msg,server_answer.body);
 
            printf("%s\n",server_answer_msg);
 
            server_answer_msg_len = strlen(server_answer_msg);
 
            while(written_bytes < server_answer_msg_len)
            {
              bytes = write(client_sockfd, server_answer_msg, sizeof(char) * strlen(server_answer_msg));
              if (bytes != strlen(server_answer_msg))
              { 
                server_answer_msg += bytes;
              }
              written_bytes += bytes;
            }
          }
          else
          {
            printf("file isn't exists\n");
            server_answer.header = "HTTP/1.1 404 Not Found\n";
            server_answer.mime_type = "Content-Type: text/html\n";
            server_answer.connection_stat = "Connection: close\n\n";
            server_answer.body = "<html><body><h1>404 Not Found</h1></body></html>";
 
            write(client_sockfd, server_answer.header, sizeof(char) * strlen(server_answer.header));
            write(client_sockfd, server_answer.mime_type, sizeof(char) * strlen(server_answer.mime_type));
            write(client_sockfd, server_answer.connection_stat, sizeof(char) * strlen(server_answer.connection_stat));
            write(client_sockfd, server_answer.body, sizeof(char) * strlen(server_answer.body));
          }
        }
        close(client_sockfd);
        exit(EXIT_SUCCESS);
    }
    else {
       close(client_sockfd);
    }
  }
}
 
int check_file_on_exist(char *filepath)
{
  FILE *fo;
 
  fo = fopen(filepath,"r");
  if (fo == NULL)
  {
    fclose(fo);
    return 1;
  }
  fclose(fo);
  return 0;
} 
 
char *getfile_html_code(char *filepath)
{
  FILE *fo;
  char *body;
 
  fo = fopen(filepath,"r");
  fscanf(fo,"%s",body);
  fclose(fo);
  return body;
}
содержимое index.html
HTML5
1
<html><body><h1>HELLOWORLD!</h1></body></html>
0
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
29.10.2013, 00:34
Всё очень плохо при работе с памятью. Возьмите в руки valgrind, процесс с клиентом банально падает с сегфолтом.
1
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
29.10.2013, 01:25
wget вполне годится.
Вы все же забыли занулить строку.
Цитата Сообщение от greenEYE Посмотреть сообщение
read(client_sockfd, msg, sizeof(msg));
printf("server get this:\n%s\n", msg);
C
1
2
3
        int m_size= read(client_sockfd, msg, sizeof(msg));
        msg[m_size]= 0;
        printf("server get this:\n%s\n", msg);
И опять же, либо выделяйте память динамически, либо берите заведомо большой буфер. На чем основана уверенность, что читаемое сообщение меньше 100 байт?

Добавлено через 10 минут
Также written_bytes нужно обнулить перед сравнением

Добавлено через 14 минут
Еще
Цитата Сообщение от greenEYE Посмотреть сообщение
fo = fopen(filepath,"r");
if (fo == NULL) { fclose(fo); return 1; }
Вы пытаетесь закрыть нулевой вайл. Результат непредсказуем. fclose не обязана проверять аргумент на 0.
1
 Аватар для greenEYE
65 / 37 / 3
Регистрация: 30.11.2011
Сообщений: 109
29.10.2013, 22:32  [ТС]
В общем ошибки понаходил,понаисправил,браузер хтмл выводит)) спасибо за ваши наводки gng, теперь новая проблема : не отображает картинки,присутствующие в html файле(скрин прикрепил),и ещё : посоветуйте,как мне лучше считывать содержимое различных файлов,ведь моего fread может не хватить,если файл будет очень большим. Думаю, может не fopen/fread использовать,а open/read..

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <fcntl.h>
#include <string.h>
 
#define DEBUG
#define PARTBUF_SIZE 1024
 
#ifdef DEBUG
#define TRACE printf("%s %d\n", __FILE__, __LINE__);
#else
#define TRACE
#endif
 
struct http_procotol
{
  char *header;
  char *mime_type;
  char *connection_stat;
  char *data_length;
  char *server;
  char *body;
};
 
char *getfile_html_code(char *filepath);
int check_file_on_exist(char *filepath);
 
struct http_procotol server_answer;
char msg[99999];
char path[99999];
 
int main()
{
  int server_sockfd, client_sockfd;
  int server_len, client_len;
  struct sockaddr_in server_address;
  struct sockaddr_in client_address;
 
  server_sockfd = socket(AF_INET,SOCK_STREAM,0);
  server_address.sin_family = AF_INET;
  server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
  server_address.sin_port = htons(6565);
  server_len = sizeof(server_address);
  bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
  
  listen(server_sockfd, 5);
  signal(SIGCHLD,SIG_IGN);
 
  while(1)
  {
    char *ppath , *pmsg;
    int bytes;
    int written_bytes;
    ppath = path;
    pmsg = msg;
 
    printf("server waititng \n");
  
    client_len = sizeof(client_address);
    client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
    if (fork() == 0) {
        printf("connection is init\n");
        memset((void *)msg,(int)'\0',99999);
        TRACE
        read(client_sockfd, msg, sizeof(msg));
        TRACE
        printf("server get this:\n%s\n", msg);
 
        if (strncmp("GET", msg, 3) == 0)
        {
          printf("this is GET query\n");
          pmsg = pmsg + 5;
 
          while(*pmsg != ' ')
          {
            *ppath++ = *pmsg++;
          }
          *ppath = 0;
          printf("need file: %s\n", path);
 
          if(check_file_on_exist(path) == 0)
          {
            printf("file exists\n");
            TRACE
            server_answer.header = "HTTP/1.1 200 OK\n";
            server_answer.server = "Host: localhost:6565\n";
            //server_answer.mime_type = "Content-Type: text/html; charset=utf-8\n";
            server_answer.connection_stat = "Connection: close\n\n";
            TRACE
            server_answer.body = getfile_html_code(path);
            printf("html: %s\n",server_answer.body);
 
            send(client_sockfd, server_answer.header, strlen(server_answer.header), 0);
            send(client_sockfd, server_answer.server, strlen(server_answer.server), 0);
            //send(client_sockfd, server_answer.mime_type, strlen(server_answer.mime_type), 0);
            send(client_sockfd, server_answer.connection_stat, strlen(server_answer.connection_stat), 0);
 
            written_bytes = 0;
            while(written_bytes < strlen(server_answer.body))
            {
              bytes = write(client_sockfd, server_answer.body, strlen(server_answer.body));
              written_bytes += bytes;
            }
          }
          else
          {
            printf("file not exists\n");
            server_answer.header = "HTTP/1.1 404 Not Found\n";
            server_answer.mime_type = "Content-Type: text/html\n";
            server_answer.connection_stat = "Connection: close\n\n";
            server_answer.body = "<html><body><h1>404 Not Found</h1></body></html>";
 
            write(client_sockfd, server_answer.header, sizeof(char) * strlen(server_answer.header));
            write(client_sockfd, server_answer.mime_type, sizeof(char) * strlen(server_answer.mime_type));
            write(client_sockfd, server_answer.connection_stat, sizeof(char) * strlen(server_answer.connection_stat));
            write(client_sockfd, server_answer.body, sizeof(char) * strlen(server_answer.body));
          }
        }
        close(client_sockfd);
        exit(EXIT_SUCCESS);
    }
    else {
       close(client_sockfd);
    }
  }
}
 
int check_file_on_exist(char *filepath)
{
  FILE *fo;
 
  fo = fopen(filepath,"r");
  if (fo == NULL)
  {
    return 1;
  }
  fclose(fo);
  return 0;
} 
 
char *getfile_html_code(char *filepath)
{
  FILE *fo;
  char *body;
 
  fo = fopen(filepath,"r");
  fread(body,PARTBUF_SIZE,1,fo);
       
  fclose(fo);
  return body;
}
Миниатюры
Не выводится ответ сервера браузеру  
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
01.11.2013, 18:02
Цитата Сообщение от greenEYE Посмотреть сообщение
как мне лучше считывать содержимое различных файлов,ведь моего fread может не хватить,если файл будет очень большим.
Функция fread может читать достаточно большие файлы. Ведь не предполагается промышленное использование программы в условиях с ограниченным количеством
памяти?
Цитата Сообщение от greenEYE Посмотреть сообщение
не отображает картинки,присутствующие в html файле
Нужно укзать в заголовке правильный тип image/png, правильный размер и не использовать строковых функций при работе с буфером. Также не нужно заканчивать бинарные данне /n, /n/n или нулем.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.11.2013, 18:02
Помогаю со студенческими работами здесь

Indy: программа не получает правильный ответ от сервера, но сниффер показывает правильный ответ
Всем привет. Моя программа должна сделать гет запрос на определенный сайт. Я включаю программу и снифферю. В сниффере показывается...

Ответ не выводится
Парни у меня не выводиться ответ, ошибки найти не могу! void Rebuild(int *a, int size) //это сортировка {int i,k=0; for...

Не выводится XML ответ
Вот запрос $curl = curl_init(&quot;http://shop.digiseller.ru/xml/shop_product_info.asp&quot;); $xml = '&lt;digiseller.request&gt; ...

Структуры. Не выводится ответ
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; struct complex { double Re; double Im; void Read(); bool...

Выводится неправильный ответ
Здравствуйте! Ребят помогите пожалуйста! Вот модуль procedure bikvad(a,b,c:real; var n:integer; var x3,x4,t1,t2:real); var x1,x2:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru