Goal
First slice of real client connectivity: connect to a Geode server, complete the handshake, send a Ping, receive a Reply. Walking-skeleton end-to-end.
Done when
- A
TcpConnection class wraps TcpClient + NetworkStream and exposes a SendFrameAsync / ReceiveFrameAsync pair built on Phase 1's frame codec.
Handshake follows the ad-hoc byte sequence in cppcache/src/TcrConnection.cpp::sendHandshakeForServer. Re-implement byte-by-byte from the C++ source — do not paraphrase.
PingAsync() sends a Ping (5) frame and awaits a Reply (6) frame.
- Integration test (Testcontainers) connects to the Geode container started by
GeodeFixture and gets a real Reply.
Tasks
References
cppcache/src/TcrConnection.cpp — sendHandshakeForServer, readHandshakeAck
cppcache/src/HandShake.cpp / .hpp
CLAUDE.md → "Handshake(最容易踩雷的一段)"
Out of scope
- Connection pool (Phase 6) — single connection only.
- Locator discovery (Phase 7) — server endpoint must be configured directly.
- TLS (Phase 8).
- Authentication (Phase 9) — anonymous only.
Branch
feat/phase-2-ping
Note
This is the protocol-correctness gauntlet. Expect to iterate. Capture bytes with Wireshark on the loopback interface if the server rejects the handshake — the diff between what we send and what the Java client sends is usually one byte off in ClientProxyMembershipID.
Goal
First slice of real client connectivity: connect to a Geode server, complete the handshake, send a Ping, receive a Reply. Walking-skeleton end-to-end.
Done when
TcpConnectionclass wrapsTcpClient+NetworkStreamand exposes aSendFrameAsync/ReceiveFrameAsyncpair built on Phase 1's frame codec.Handshakefollows the ad-hoc byte sequence incppcache/src/TcrConnection.cpp::sendHandshakeForServer. Re-implement byte-by-byte from the C++ source — do not paraphrase.PingAsync()sends aPing (5)frame and awaits aReply (6)frame.GeodeFixtureand gets a realReply.Tasks
src/Geode.Client/Transport/TcpConnection.cssrc/Geode.Client/Transport/Handshake.cssrc/Geode.Client/Transport/ClientProxyMembershipID.cs(host / PID / UUID / durable id)src/Geode.Client/Operations/PingOperation.cstests/Geode.Client.Tests/Transport/HandshakeBytesTests.cs(golden bytes)tests/Geode.Client.IntegrationTests/PingTests.csReferences
cppcache/src/TcrConnection.cpp—sendHandshakeForServer,readHandshakeAckcppcache/src/HandShake.cpp/.hppCLAUDE.md→ "Handshake(最容易踩雷的一段)"Out of scope
Branch
feat/phase-2-pingNote
This is the protocol-correctness gauntlet. Expect to iterate. Capture bytes with Wireshark on the loopback interface if the server rejects the handshake — the diff between what we send and what the Java client sends is usually one byte off in
ClientProxyMembershipID.