Как отобразить видео на веб-сервере с http? (Передача файла программирования tcp-сокета на сервер в c) - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь передать файл, который клиент запрашивает с 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;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...