# Ping

1. The client uses [QueryPerformanceCounter](https://learn.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter) to generate an arbitrary timestamp, which it converts roughly into milliseconds by dividing it by 10,000.
2. An IPC message is sent by the client which includes the timestamp encoded as a 32-bit integer value.
3. An IPC message is sent back by the server with the same timestamp.
4. The client generates a new timestamp, divides it by 10,000, and then computes the difference between them to get the RTT for the connection.

## Pseudocode

```c
void SendPingRequest() {
    int64_t t;
    PingRequest req;
    QueryPerformanceCounter(&t);
    req.timestamp = (int32_t)(t / 10000);
    SendMessage(req);
}

int32_t HandlePingResponse(PingResponse resp) {
    int64_t currT;
    int32_t prevMs = resp.timestamp;
    QueryPerformanceCounter(&currT);
    int32_t currMs = (int32_t)(currT / 10000);
    return currMs - prevMs;
}
```

## Remarks

{% hint style="info" %}
Because the server copies the same timestamp into the response message as is in the request message, ping calculation can be done in a stateless manner with respect to the client.
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://xiv.dev/network/ping.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
