Я пытаюсь передать файл, который клиент запрашивает с URL-адресом, например
http://localhost:10080/test.mp4
Я должен получить большинство типов файлов, которые являются нормальными для веб-сайтов.Для изображений, TXT, HTML, PDF он успешно отображает файлы в Интернете.Я также должен отображать видео (не загружать), но не могу.
[# 1]
мой заголовок HTTP: «HTTP / 1.1 200 OK \ r \ n \ r \ n"
это дает мне сообщение, которое включает в себя следующую строку: Accept: text / html, application / xhtml + xml, image / jxr, * / * (без пробелов!)
, когда я пытался [# 1], взломанные слова
ex) �U��D�} �r�mU� ~ 嶼 V! �H: y⒦XR
.Я предполагаю, что может потребоваться некоторая кодировка ..? Но не уверен.
[# 2]
изменил заголовок HTTP на: "HTTP / 1.1 200 OK \ r \ nМатериал-тип: video /mp4 \ r \ nContent-Length: 99999999999 \ r \ n "
Для [# 2] сообщение о загрузке появляется в Интернете, и его размер совпадает с тем, который я установил в Content-Length в заголовке HTTP, а нереальный размер файла mp4.Он продолжает запрашивать загрузку, даже когда я удаляю Content-Length.
Как я могу отобразить видеофайл в Интернете, используя http, tcp?
Если вы хотите просмотреть код только о загрузке файла, пожалуйста, выполните поиск (извините, но при попытке выполнить ошибку выдается ошибка).сократить):
char * имя_файла = get_filename (client_msg);
#define _CRT_SECURE_NO_WARNINGS
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <fcntl.h>
////server.c
int file_exists(char* filename) {
FILE* file;
if (file = fopen(filename, "rb")) {
fclose(file);
return 1;
}
return -1;
}
int isthere_params(char* msg) {
//index.html
if (msg[5] ==' ') return -1;
//log in
else if (msg[5] == '?')
return 1;
//file request
else return 0;
}
char* get_filename(char* msg) {
char * parsed_name = (char*)malloc(sizeof(char)*2050);
int i,idx=0;
for(i=5; i<2050; i++) {
if (msg[i] == ' ') break;
parsed_name[idx++] = msg[i];
}
return parsed_name;
}
int main(int argc, char *argv[]) {
int* login_flag = (int*)malloc(sizeof(int));
*(login_flag)=0;
int len,is_params, server_socket, client_socket, client_addr_size, client_msg_size;
struct sockaddr_in server_addr, client_addr;
char client_msg[10000], buf[4100];
char rsp_packet[2048]="HTTP/1.1 200 OK\r\n\r\n";
//char rsp_packet_copy[2048]="HTTP/1.1 200 OK\r\nContent-Type :video/mp4\r\nContent-Length :99999999999";
char _403_packet[1024] = "HTTP/1.1 403 Forbidden\r\n\r\nYou dont't have permission to access ";
char _404_packet[1024] = "HTTP/1.1 404 Not Found\r\r\r\rFile is not found";
if (argc != 2) {
printf("Usage : %s <port>\n", argv[0]);
return -1;
}
server_socket = socket(PF_INET, SOCK_STREAM, 0);
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(atoi(argv[1]));
//bind
if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
puts("bind error!");
return -1;
}
//listen
listen(server_socket, 10);
//enter the loop
while(1) {
puts("wait to accept.... \n");
client_addr_size = sizeof(client_addr);
client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_addr_size);
if (client_socket == -1)
puts("fail to accept client connection! ");
//receive from client
if ((client_msg_size = recv(client_socket, client_msg,100,0)) > 0) {
printf("%s \n\n", client_msg);
//is_params 1:OK -1:Entrance url 0:file input
is_params = isthere_params(client_msg);
printf("isparams!----->%d\n", is_params );
printf("\n\n login flag-->%d \n\n",*login_flag);
if (is_params == -1) {
send(client_socket, rsp_packet,strlen(rsp_packet),0);
int fr = open("index.html",O_RDONLY);
if (fr <0) {
puts("Error(index)");
exit(1);
}
while ((len=read(fr,buf, 4096)) > 0 ) {
send(client_socket,buf,len, 0);
}
close(fr);
}
else if (is_params == 1) {
send(client_socket, rsp_packet,strlen(rsp_packet),0);
*(login_flag)=1;
int secret = open("secret.html",O_RDONLY);
if ( secret<0) {
puts ("Error(secret)");
exit(1);
}
while ((len = read(secret, buf, 4096)) >0) {
send(client_socket,buf,len, 0);
}
}
else if (is_params == 0) {
//when failed to login
if (*login_flag == 0)
send(client_socket, _403_packet, strlen(_403_packet),0);
else {
char* file_name = get_filename(client_msg);
if (file_exists(file_name)== -1) {
send(client_socket, _404_packet, strlen(_404_packet),0);
} else {
send(client_socket, rsp_packet,strlen(rsp_packet),0);
int fr = open(file_name,O_RDONLY);
if (fr <0) {
puts("Error(file)");
exit(1);
}
while ((len=read(fr,buf, 4096)) > 0 ) {
send(client_socket,buf,len, 0);
}
close(fr);
}
}
}
//Send the message back to client
//write(client_socket, client_msg, sizeof(client_msg));
}
close(client_socket);
}//end while
close(server_socket);
return 0;
}