Как читать и отправлять HTML-файл через сокет TCP? - PullRequest
2 голосов
/ 09 сентября 2010

Я пишу код для веб-сервера и пытаюсь отправить html-файл index.html через сокет TCP.Как бы я это сделал?

В данный момент я пытаюсь прочитать содержимое файла, а затем отправить его через соединение.Однако страница не принимается правильно.Я подозреваю, что я использую неправильную функцию для чтения.Но я не уверен, что еще делать = с.Пожалуйста, помогите!

В конце кода я закрываю и очищаю все файлы и буферы.

while(!feof(sendFile)){

fgets(send_buffer, MAX_LEN, sendFile);

send(new_fd,send_buffer,sizeof(send_buffer),0);
}

Вот функция, которую я пытаюсь реализовать.Это просто чтобы вернуть страницу ошибки http 404:

} else {
        len = strlen("HTTP/1.1 404 Not Found\n");
        send(new_fd, "HTTP/1.1 404 Not Found\n", len, 0);
        send(new_fd,"Connection: Keep Alive\n",strlen("Connection: Keep  Alive\n"),0);
        send(new_fd,"Content-Type: html\n",strlen("Content-Type: html\n"),0);
        //read and send the contents of the 404.html file
        //open file
        if((sendFile = fopen("404.html","r"))<0){
            printf("FILE DID NOT OPEN!\n");
            exit(1);
        }
        //obtain file size
        fseek (sendFile , 0 , SEEK_END);
        Fsize = ftell (sendFile);
        rewind (sendFile);

/*          // allocate memory to contain the whole file:
        send_buffer = (char*) malloc (sizeof(char)*Fsize);
        if(send_buffer == NULL){
            printf("Memory error"); 
            exit (1);
        }

        // copy the file into the buffer:
        result = fread (send_buffer,1,Fsize,sendFile);
        if(result != Fsize) {
            printf("Reading error"); 
            exit (1);
        }
*/
        send(new_fd,"Content-Length: ",strlen("Content-Length: "),0);
        send(new_fd,int(Fsize),4,0); //this line is causing errors!!!!
        send(new_fd,"\n",strlen("\n"),0);
        while(!feof(sendFile)){
            bzero(send_buffer,MAX_MSG);
            fgets(send_buffer, sizeof(send_buffer), sendFile);
            //result = send(new_fd,send_buffer,strlen(send_buffer),0);
                if(send(new_fd,send_buffer,sizeof(send_buffer),0)!=sizeof(send_buffer)){
                printf("Sending 404.html Failed\n");
                break;
            }
        }
        fclose(sendFile);
        printf("Sent file\n");
    }

} else if(strcmp(request_page, POST)==0){
    // THIS IS WHERE YOU CAN TACKLE POST MESSAGES
}

1 Ответ

1 голос
/ 10 сентября 2010

Предполагая, что вы отправляете правильные заголовки HTTP до отправки содержимого файла (в частности, заголовок Content-Length), вам следует иметь в виду, что fgets () предназначен для чтения строк, но HTTP работает на двоичном данные вместо. Вы должны использовать fread () вместо fgets (). Кроме того, при вызове send () вам нужно указать только количество байтов, которые фактически возвращает fgets / fread (), не отправлять весь буфер, если фактически весь буфер не был заполнен. Наконец, вы должны принять во внимание, что send () может принимать / передавать меньше байтов, чем вы запрашиваете, поэтому вам может потребоваться вызвать send () несколько раз для одного буфера.

Попробуйте это:

unsigned char send_buffer[MAX_LEN];

while( !feof(sendFile) )
{
    int numread = fread(send_buffer, sizeof(unsigned char), MAX_LEN, sendFile);
    if( numread < 1 ) break; // EOF or error

    unsigned char *send_buffer_ptr = send_buffer;
    do
    {
        int numsent = send(new_fd, send_buffer_ptr, numread, 0);
        if( numsent < 1 ) // 0 if disconnected, otherwise error
        {
            if( numsent < 0 )
            {
                if( WSAGetLastError() == WSAEWOULDBLOCK )
                {
                    fd_set wfd;
                    FD_ZERO(&wfd);
                    FD_SET(new_fd, &wfd);

                    timeval tm;
                    tm.tv_sec = 10;
                    tm.tv_usec = 0;

                    if( select(0, NULL, &wfd, NULL, &tm) > 0 )
                        continue;
                }
            }

            break; // timeout or error
        }

        send_buffer_ptr += numsent;
        numread -= numsent;
    }
    while( numread > 0 );
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...