Я пишу веб-сервер HTTP, когда я отправляю текстовый файл с эквивалентным содержимым файла HTML в браузер, браузер показывает его правильно, но когда я отправляю сам браузер HTML-файла показывает страницу HTML на секунду, а затем появляется сообщение об ошибке «соединение было сброшено».Отправка html-файла с HTTP-протоколом через tcp и браузера показывает ошибку
Я заметил, что текстовый файл больше, чем HTML файл, но я понятия не имею, почему
размер шрифта = 286 байт
HTML размер = 142 байт
и это HTML код:
<!DOCTYPE html>
<html>
<body>
<p>This is a paragraph.</p>
<p>This is a paragraph.</p>
<p>This is a paragraph.</p>
</body>
</html>
это мой код:
char sendBuffer[500];
FILE *sendFile = fopen("foo.html", "r");
fseek(sendFile, 0L, SEEK_END);
int sz = ftell(sendFile);
fseek(sendFile, 0L, SEEK_SET);
string s1;
s1="HTTP/1.1 200 OK\nContent-length: " + to_string(sz) + "\n";
std::vector<char> writable(s1.begin(), s1.end());
writable.push_back('\0');
strcpy(sendBuffer,(const char *)&writable[0]);
int c=send(connected,(const char*)&sendBuffer,strlen(&writable[0]),0);
printf("\nSent : %s\n",sendBuffer);
strcpy(sendBuffer,"Content-Type: text/html\n\n");
c=send(connected,(const char*)&sendBuffer,strlen("Content-Type: text/html\n\n"),0);
printf("\nSent : %s\n",sendBuffer);
char send_buffer[300];
while(!feof(sendFile))
{
int numread = fread(send_buffer, sizeof(unsigned char), 300, sendFile);
if(numread < 1) break; // EOF or error
char *send_buffer_ptr = send_buffer;
do {
int numsent = send(connected, 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(connected, &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);
}
Вот другая часть кода, который используется непосредственно перед выше код:
int sock, connected, bytes_recieved , _true = 1 , portNumber;
char send_data [1024] , recv_data[1024];
struct sockaddr_in server_addr,client_addr;
int sin_size;
time_t t = time(NULL);
struct tm tm = *localtime(&t);
char date[50];
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("Unable to create the Socket");
exit(1);
}
if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(const char*)&_true,sizeof(int)) == -1) {
perror("Unable to Setsockopt");
exit(1);
}
char *server_address="127.1.1.1";
portNumber=8080;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portNumber);
server_addr.sin_addr.s_addr = inet_addr("127.1.1.1");//inet_pton(AF_INET,"127.0.0.1",&server_addr.sin_addr);//INADDR_ANY;
string host=server_address+':'+to_string(portNumber);
memset(&(server_addr.sin_zero),0,8);//sockaddr_in zero padding is needed
if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))==-1) //bind the socket to a local address
{
perror("Unable to bind");
exit(1);
}
if (listen(sock, 5) == -1) //listen to the socket with the specified waiting queue size
{
perror(" Listen");
exit(1);
}
cout << "MyHTTPServer waiting on port 8080" << endl;
fflush(stdout);
sin_size = sizeof(struct sockaddr_in);
connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size);
cout<< "I got a connection from (" << inet_ntoa(client_addr.sin_addr) << "," << ntohs(client_addr.sin_port) << ')' << endl;
Проголосовало против смещения приводом вниз. Также вопрос представляется разумным. –
HTTP требует «\ r \ n» строк, «\ n» недостаточно. Если это не решит вашу проблему, попробуйте придумать минимальный * полный * пример. – Phillip
@Phillip Вы правы, но я видел, что реализации корректно работают только с '\ n'. И поскольку я сказал, что он работает правильно, когда он находится в текстовом формате. Проблема заключается в формате 'HTML'. Вы знаете, почему размер' HTML' и текстовых файлов отличается? –