Картинки?
Я тут на сегодня написал простой сервер под линух.
#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;
}
Все нормально компилируется. Но отправляются нормально только текстовые файлы. Картинки не отпраляются. Что сделать что бы картинки отправлялись???
П.С. Да, код кривоватый)
Код:
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);
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 );
}
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);
Чтобы браузер понял что ето картинка ему нужно явно указать Content-Type: image/jpeg например.
Такчто вотэтовот
// header
//(*rr).res_head = ""
//
// here some place for more HTTP support
//
доделывайте.
Соответственно, получает в ответ запрошенную картинку. Не всё сразу.
Тут нужно смотреть в сторону Вашей реализации HTTP. ;)
Код:
//
// here some place for more HTTP support
//
// here some place for more HTTP support
//
Всем спасибо, все работает :)
просто у меня не сделана часть с генерированием заголовка хттп ответа, но программа отправляла "заговок" содержащий бред.