przeglądarka wysyła zapytania w parach

0

Mam taki kodzik który uruchamia serwer, w razie kontaktu z przeglądarką pobiera dane z klawiatury i odsyła stronę - ale 2 razy się uruchamia przy jednym wczytaniu strony

#include <winsock2.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>

#pragma comment(lib, "ws2_32.lib")

// Define the structure
struct res {
    const char* res1;
    char tmp[200];
    const char* res3;
};

// Create an instance of the structure
struct res tmp_res = {
    "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<html><body>",
    "",  // Initialize tmp as an empty string
    "</body></html>"
};

char httpResponse[2000];
int dl = 0;

// ...

void load() {
    // Clear httpResponse array
    memset(httpResponse, 0, sizeof(httpResponse));
dl=0;
    // Copy res1 to httpResponse
    strcpy(httpResponse + dl, tmp_res.res1);
    dl += strlen(tmp_res.res1);

    // Take input from the user for tmp_res.tmp
    printf("Enter content for tmp_res.tmp: ");
    scanf("%199s", tmp_res.tmp);  // Limit input to 199 characters to leave space for null-terminator
    
    // Copy tmp_res.tmp to httpResponse
    strcpy(httpResponse + dl, tmp_res.tmp);
    dl += strlen(tmp_res.tmp);

    // Copy res3 to httpResponse
    strcpy(httpResponse + dl, tmp_res.res3);
    dl += strlen(tmp_res.res3);

    // Add Connection: close header
    strcat(httpResponse + dl, "Connection: close\r\n");
    dl += strlen("Connection: close\r\n");

    // Add Content-Length header
    char contentLengthHeader[100];
    sprintf(contentLengthHeader, "Content-Length: %d\r\n", (int)strlen(tmp_res.tmp));
    strcpy(httpResponse + dl, contentLengthHeader);
    dl += strlen(contentLengthHeader);

    dl++;  // Add one extra byte (for null-terminator)
}

// ...


int main() {
    WSADATA wsaData;

    // Initialize Winsock
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        fprintf(stderr, "Failed to initialize Winsock.\n");
        return 1;
    }

    // Create socket
    SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (serverSocket == INVALID_SOCKET) {
        fprintf(stderr, "Failed to create socket.\n");
        WSACleanup();
        return 1;
    }

    // Set up the server address structure
    struct sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(8080);  // Port 8080

    // Bind the socket
    if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
        fprintf(stderr, "Failed to bind socket.\n");
        closesocket(serverSocket);
        WSACleanup();
        return 1;
    }
int k=0;
    do {
        // Listen for incoming connections
        if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) {
            fprintf(stderr, "Error listening on socket.\n");
            closesocket(serverSocket);
            WSACleanup();
            return 1;
        }

        printf("Server listening on port 8080...\n");

        // Accept incoming connections
        SOCKET clientSocket = accept(serverSocket, NULL, NULL);
        if (clientSocket == INVALID_SOCKET) {
            fprintf(stderr, "Error accepting connection.\n");
            closesocket(serverSocket);
            WSACleanup();
            return 1;
        }

        printf("Client connected.\n");

        // Receive and print data
        char buffer[1024];
        memset(buffer, 0, sizeof(buffer));
        int bytesRead = recv(clientSocket, buffer, sizeof(buffer) - 1, 0);
        if (bytesRead > 50) {


 // TO JEST WYKONYWANE 2 razy 


            buffer[bytesRead] = '\0';
           // printf("Received data:\n%s\n---------\n----\n%d\n----\n", buffer,k);k++;
            load();
            send(clientSocket, httpResponse, strlen(httpResponse), 0);
    
        }

        // Cleanup for the current connection
        closesocket(clientSocket);
        printf("Client disconnected.\n");
        
    } while (1);

    // Cleanup (this part will never be reached in this example)
    closesocket(serverSocket);
    WSACleanup();

    return 0;
}

I normalnie odczytuje pierwsze zapytanie do serwera, pobiera dane z klawiatury wyświetla je na stronie ale zaraz potem próbuje wczytać drugi raz

jak to zatrzymać, to wygląda jak by przeglądarka podwójne zapytania wysyłała

pup_1.jpg

0

Wydrukuj nagłówki (HTTP Headers) z obu zapytań i dowiesz się dlaczego.

0
jarekr000000 napisał(a):

Wydrukuj nagłówki (HTTP Headers) z obu zapytań i dowiesz się dlaczego.

Pierwszy i drugi

pup_1.jpgpup_2.jpg

2

Szkoda, że wkleiłeś obrazki.
Ale i tak widać o co chodzi:
pierwsze to zapytanie o stronę główną - GET /
drugie o ikonke do taba GET /favicon.ico

Klasyka.
(A mogą być jeszcze zapytania związane z cache, CORS itd.). Trochę tych "bezsensownych" zapytań od przeglądarek jest.

0
jarekr000000 napisał(a):

Szkoda, że wkleiłeś obrazki.
Ale i tak widać o co chodzi:
pierwsze to zapytanie o stronę główną - GET /
drugie o ikonke do taba GET /favicon.ico

Klasyka.
(A mogą być jeszcze zapytania związane z cache, CORS itd.). Trochę tych "bezsensownych" zapytań od przeglądarek jest.

A tutaj drugi raz nie wczytuje czemu? (drugi raz fffff powinno być a nie ma)

C:\Users\juzio\Desktop\http>serwerek.exe
Server listening on port 8080...
Client connected.
Received data:
GET / HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Microsoft Edge";v="113", "Chromium";v="113", "Not-A.Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0
Safari/537.36 Edg/113.0.1774.57
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,**;q=0.8,application/signed-
exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: pl,en;q=0.9,en-GB;q=0.8,en-US;q=0.7


---------
Enter content for tmp_res.tmp: ssssssssssss

--------------
HTTP/1.1 200 OK
Content-Type: text/html

<html><body>ssssssssssss</body></html>
-----------------
Client disconnected.
Server listening on port 8080...
Client connected.
Client disconnected.
Server listening on port 8080...
Client connected.
Client disconnected.
Server listening on port 8080...
Client connected.
Client disconnected.
Server listening on port 8080...
Client connected.
Received data:
GET / HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Microsoft Edge";v="113", "Chromium";v="113", "Not-A.Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0
Safari/537.36 Edg/113.0.1774.57
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,**;q=0.8,application/signed-
exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: pl,en;q=0.9,en-GB;q=0.8,en-US;q=0.7


---------
Enter content for tmp_res.tmp: fffffffff

--------------

-----------------
Client disconnected.
Server listening on port 8080...
Client connected.
Client disconnected.
Server listening on port 8080...
Client connected.
Received data:
GET / HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Microsoft Edge";v="113", "Chromium";v="113", "Not-A.Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.57
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,**;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: pl,en;q=0.9,en-GB;q=0.8,en-US;q=0.7

pup_1.jpg

0
johnny_Be_good napisał(a):

A tutaj drugi raz nie wczytuje czemu? (drugi raz fffff powinno być a nie ma)

Prawdopodobnie musisz o to zapytać twórców przeglądarki (microsoft?).

0

Oto działający kod

#include <winsock2.h>
#include <stdio.h>
#include <string.h>

#pragma comment(lib, "ws2_32.lib")

// Define the structure
struct res {
    const char* res1;
    char tmp[200];
    const char* res3;
};

// Create an instance of the structure
struct res tmp_res = {
    "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<html><body>",
    "",  // Initialize tmp as an empty string
    "</body></html>"
};

char httpResponse[2000];
int dl = 0;
int w=0;
void load() {
    // Clear httpResponse array
    //memset(httpResponse, 0, sizeof(httpResponse));

    // Copy res1 to httpResponse
    strcpy(httpResponse + dl, tmp_res.res1);
    dl += strlen(tmp_res.res1);

    // Take input from the user for tmp_res.tmp
    printf("Enter content for tmp_res.tmp: ");
    scanf("%199s", tmp_res.tmp);  // Limit input to 199 characters to leave space for null-terminator

    // Copy tmp_res.tmp to httpResponse
    strcpy(httpResponse + dl, tmp_res.tmp);
    dl += strlen(tmp_res.tmp);

    // Copy res3 to httpResponse
    strcpy(httpResponse + dl, tmp_res.res3);
    dl += strlen(tmp_res.res3);

    dl++;  // Add one extra byte (for null-terminator)
}

int main() {
    WSADATA wsaData;

    // Initialize Winsock
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        fprintf(stderr, "Failed to initialize Winsock.\n");
        return 1;
    }

    // Create socket
    SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (serverSocket == INVALID_SOCKET) {
        fprintf(stderr, "Failed to create socket.\n");
        WSACleanup();
        return 1;
    }

    // Set up the server address structure
    struct sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(8080);  // Port 8080

    // Bind the socket
    if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
        fprintf(stderr, "Failed to bind socket.\n");
        closesocket(serverSocket);
        WSACleanup();
        return 1;
    }

    do {
        // Listen for incoming connections
        if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) {
            fprintf(stderr, "Error listening on socket.\n");
            closesocket(serverSocket);
            WSACleanup();
            return 1;
        }

        printf("Server listening on port 8080...\n");

        // Accept incoming connections
        SOCKET clientSocket = accept(serverSocket, NULL, NULL);
        if (clientSocket == INVALID_SOCKET) {
            fprintf(stderr, "Error accepting connection.\n");
            closesocket(serverSocket);
            WSACleanup();
            return 1;
        }

        printf("Client connected.\n");

        // Receive and print data
        char buffer[1024];

        int bytesRead = recv(clientSocket, buffer, sizeof(buffer) - 1, 0);

        if (bytesRead > 0 && buffer[5] == 32) {
            buffer[bytesRead] = '\0';
            printf("Received data:\n%s\n---------\n", buffer);
            load();w++;
            httpResponse[strlen(httpResponse)-17]=w+49;
            send(clientSocket, httpResponse, strlen(httpResponse), 0);
            printf("\n--------------\n");
            printf("%s\n-----------------\n", httpResponse);
        }

        // Cleanup for the current connection
        closesocket(clientSocket);
        printf("Client disconnected.\n");

    } while (1);

    // Cleanup (this part will never be reached in this example)
    closesocket(serverSocket);
    WSACleanup();

    return 0;
}
0
jarekr000000 napisał(a):

.. CORS itd.). Trochę tych "bezsensownych" zapytań od przeglądarek jest.

``

To mogę przez POST przesłać kod C do serwera i tam go skompilować tak?

albo gcc może kompilować kod i zwracać wynik do przeglądarki tak? zamiast PHP ?
Przekierować wyjście z konsoli na plik,

Formularz wyśle zapis w mojej notacji, a serwer go obsłuży tak jak to określę, własną specyfikację zapisu potrzebuję zrobić i rozpromować

2
johnny_Be_good napisał(a):
jarekr000000 napisał(a):

.. CORS itd.). Trochę tych "bezsensownych" zapytań od przeglądarek jest.

``

To mogę przez POST przesłać kod C do serwera i tam go skompilować tak?

albo gcc może kompilować kod i zwracać wynik do przeglądarki tak? zamiast PHP ?
Przekierować wyjście z konsoli na plik,

Jak taki serwer napiszesz to możesz. Oczywiście. (Nawet robiłem takie śmieszne rzeczy).

1 użytkowników online, w tym zalogowanych: 0, gości: 1