Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Картинки?

47K
07 января 2012 года
BOTOKILLER
38 / / 16.11.2010
Привет всем!
Я тут на сегодня написал простой сервер под линух.


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORTNUM 80

typedef struct
{
int req_h_sz, res_h_sz, res_b_sz;

char *req_head;
char *res_head;
char *res_body;
} dialog;

char *read_file(char fname[])
{
FILE *f1;
char *buffer;

f1 = fopen(fname, "rb");

fseek(f1, 0, SEEK_END);
int fs = ftell(f1);
fseek(f1, 0, SEEK_SET);

buffer = malloc((size_t)(fs+1));

fread(buffer, (size_t)(sizeof(char)), (size_t)(fs), f1);
*(buffer+fs)='\0';
printf("file %d %d %s \n", fs, errno, strerror(errno));
fclose(f1);

return buffer; //0 on success
}

int process_req(dialog *rr)
{
char *file_addr;
char *file_addr_end;

file_addr = strchr((*rr).req_head, ' ');
*file_addr = '.';
file_addr_end = strchr(file_addr, ' ');
*file_addr_end = '\0';
(*rr).res_body = read_file(file_addr);
(*rr).res_b_sz = strlen((*rr).res_body);
printf("%s \n", file_addr);
*file_addr = ' ';
*file_addr_end = ' ';

// header
//(*rr).res_head = ""

//
// here some place for more HTTP support
//
return 0;
}

int listen_for_req(int main_sock)
{
int con_sock;
int sz_sa = sizeof(struct sockaddr);
struct sockaddr_in client_info;
dialog rr;
rr.req_h_sz = 4096;
rr.req_head = (char *)(malloc(rr.req_h_sz));

do
{
int abc = listen(main_sock, 1);
printf("2 %d %d %s\n", abc, errno, strerror(errno));
con_sock = accept(main_sock, (struct sockaddr *)&client_info, &sz_sa);
printf("3 %d %s\n", errno, strerror(errno));
recv(con_sock, rr.req_head, rr.req_h_sz, 0);
process_req(&rr);
printf("4 %d %s\n", errno, strerror(errno));
printf(rr.req_head);
//send(con_sock, rr.res_head, rr.res_h_sz, 0); //header will be later
//printf("5 %d %s\n", errno, strerror(errno));
send(con_sock, rr.res_body, rr.res_b_sz, 0);
printf("6 %d %s\n", errno, strerror(errno));
close(con_sock);
} while(0==0);

return 0;
}

int create_sock()
{
int sock = socket(AF_INET, SOCK_STREAM, 0);

struct sockaddr_in serv_info;
serv_info.sin_family = AF_INET;
serv_info.sin_addr.s_addr = INADDR_ANY;
serv_info.sin_port = htons(PORTNUM);

int abc = bind(sock, (struct sockaddr *)&serv_info, sizeof(struct sockaddr));
printf("%d \n", abc);
return sock;
}

int main()
{
int main_sock = create_sock();
printf("1 %d %d %s\n", main_sock, errno, strerror(errno));
listen_for_req(main_sock);
close(main_sock);
return 0;
}


Все нормально компилируется. Но отправляются нормально только текстовые файлы. Картинки не отпраляются. Что сделать что бы картинки отправлялись???
П.С. Да, код кривоватый)
16K
07 января 2012 года
asmforce
186 / / 05.01.2010
Файл нужно читать кусками, кусками и отправлять, вместо
 
Код:
fseek(f1, 0, SEEK_END);
 int fs = ftell(f1);
 fseek(f1, 0, SEEK_SET);

 buffer = malloc((size_t)(fs+1));

 fread(buffer, (size_t)(sizeof(char)), (size_t)(fs), f1);


где-то так

 
Код:
const cachesize = 8192;  // размер буфера выбираете сами, исходя из здравого смысла
int bytes;
char *cache = (char*) malloc( cachesize );  // при известном и небольшом размере буфера, можно обойтись и статическим распределением

while( (bytes = fread(cache,sizeof(char),cachesize,f1)) > 0 )  {
  send( con_sock, rr.res_head, rr.res_h_sz, 0 );
}


Это что такое?
 
Код:
(*rr).res_b_sz = strlen((*rr).res_body);
277
12 января 2012 года
arrjj
1.7K / / 26.01.2011
А хттп-заголовок отправляется где?
Чтобы браузер понял что ето картинка ему нужно явно указать Content-Type: image/jpeg например.
Такчто вотэтовот
// header
//(*rr).res_head = ""

//
// here some place for more HTTP support
//
доделывайте.
16K
12 января 2012 года
asmforce
186 / / 05.01.2010
Если я не ошибаюсь, браузер отправляет запрос на получение каждой картинки по-отдельности?
Соответственно, получает в ответ запрошенную картинку. Не всё сразу.

Тут нужно смотреть в сторону Вашей реализации HTTP. ;)
 
Код:
//
 // here some place for more HTTP support
 //
47K
12 января 2012 года
BOTOKILLER
38 / / 16.11.2010
Код уже другой - полностью все переделал

Всем спасибо, все работает :)

просто у меня не сделана часть с генерированием заголовка хттп ответа, но программа отправляла "заговок" содержащий бред.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог