diff --git a/include/CSFML/Network/IpAddress.h b/include/CSFML/Network/IpAddress.h index 3e79d051..3e1d7006 100644 --- a/include/CSFML/Network/IpAddress.h +++ b/include/CSFML/Network/IpAddress.h @@ -132,7 +132,7 @@ CSFML_NETWORK_API void sfIpAddress_toString(sfIpAddress address, char* string); /// address, and should be used for optimization purposes only /// (like sending the address through a socket). /// The integer produced by this function can then be converted -/// back to a sfIpAddress with sfIpAddress_FromInteger. +/// back to a sfIpAddress with sfIpAddress_fromInteger. /// /// \param address Address object /// diff --git a/include/CSFML/Network/Packet.h b/include/CSFML/Network/Packet.h index 3a4b6140..46261626 100644 --- a/include/CSFML/Network/Packet.h +++ b/include/CSFML/Network/Packet.h @@ -75,6 +75,8 @@ CSFML_NETWORK_API void sfPacket_append(sfPacket* packet, const void* data, size_ /// /// The next read operation will read data from this position /// +/// \param packet Packet object +/// /// \return The byte offset of the current read position /// /// \see append @@ -163,6 +165,8 @@ CSFML_NETWORK_API int16_t sfPacket_readInt16(sfPacket* packet); CSFML_NETWORK_API uint16_t sfPacket_readUint16(sfPacket* packet); CSFML_NETWORK_API int32_t sfPacket_readInt32(sfPacket* packet); CSFML_NETWORK_API uint32_t sfPacket_readUint32(sfPacket* packet); +CSFML_NETWORK_API int64_t sfPacket_readInt64(sfPacket* packet); +CSFML_NETWORK_API uint64_t sfPacket_readUint64(sfPacket* packet); CSFML_NETWORK_API float sfPacket_readFloat(sfPacket* packet); CSFML_NETWORK_API double sfPacket_readDouble(sfPacket* packet); CSFML_NETWORK_API void sfPacket_readString(sfPacket* packet, char* string); @@ -181,6 +185,8 @@ CSFML_NETWORK_API void sfPacket_writeInt16(sfPacket* packet, int16_t); CSFML_NETWORK_API void sfPacket_writeUint16(sfPacket* packet, uint16_t); CSFML_NETWORK_API void sfPacket_writeInt32(sfPacket* packet, int32_t); CSFML_NETWORK_API void sfPacket_writeUint32(sfPacket* packet, uint32_t); +CSFML_NETWORK_API void sfPacket_writeInt64(sfPacket* packet, int64_t); +CSFML_NETWORK_API void sfPacket_writeUint64(sfPacket* packet, uint64_t); CSFML_NETWORK_API void sfPacket_writeFloat(sfPacket* packet, float); CSFML_NETWORK_API void sfPacket_writeDouble(sfPacket* packet, double); CSFML_NETWORK_API void sfPacket_writeString(sfPacket* packet, const char* string); diff --git a/include/CSFML/Network/TcpListener.h b/include/CSFML/Network/TcpListener.h index d3f90ad4..21043ded 100644 --- a/include/CSFML/Network/TcpListener.h +++ b/include/CSFML/Network/TcpListener.h @@ -99,6 +99,10 @@ CSFML_NETWORK_API unsigned short sfTcpListener_getLocalPort(const sfTcpListener* /// If the socket was previously listening to another port, /// it will be stopped first and bound to the new port. /// +/// When providing `sfTcpListener_anyPort()` as port, the listener +/// will request an available port from the system. +/// The chosen port can be retrieved by calling `sfTcpListener_getLocalPort()`. +/// /// If there is no specific address to listen to, pass sfIpAddress_Any /// /// \param listener TCP listener object @@ -110,6 +114,17 @@ CSFML_NETWORK_API unsigned short sfTcpListener_getLocalPort(const sfTcpListener* //////////////////////////////////////////////////////////// CSFML_NETWORK_API sfSocketStatus sfTcpListener_listen(sfTcpListener* listener, unsigned short port, sfIpAddress address); +//////////////////////////////////////////////////////////// +/// \brief Stop listening and close the socket +/// +/// This function gracefully stops the listener. If the +/// socket is not listening, this function has no effect. +/// +/// \param listener TCP listener object +/// +//////////////////////////////////////////////////////////// +CSFML_NETWORK_API void sfTcpListener_close(sfTcpListener* listener); + //////////////////////////////////////////////////////////// /// \brief Accept a new connection /// @@ -127,3 +142,12 @@ CSFML_NETWORK_API sfSocketStatus sfTcpListener_listen(sfTcpListener* listener, u /// //////////////////////////////////////////////////////////// CSFML_NETWORK_API sfSocketStatus sfTcpListener_accept(sfTcpListener* listener, sfTcpSocket** connected); + +//////////////////////////////////////////////////////////// +/// \brief Return the special value that tells the system +/// to pick any available port +/// +/// \return The value to use for any port +/// +//////////////////////////////////////////////////////////// +CSFML_NETWORK_API unsigned short sfTcpListener_anyPort(void); diff --git a/include/CSFML/Network/UdpSocket.h b/include/CSFML/Network/UdpSocket.h index e148442e..d3be5b42 100644 --- a/include/CSFML/Network/UdpSocket.h +++ b/include/CSFML/Network/UdpSocket.h @@ -102,6 +102,10 @@ CSFML_NETWORK_API unsigned short sfUdpSocket_getLocalPort(const sfUdpSocket* soc /// system to automatically pick an available port, and then /// call sfUdpSocket_getLocalPort to retrieve the chosen port. /// +/// When providing `sfUdpSocket_anyPort()` as port, the listener +/// will request an available port from the system. +/// The chosen port can be retrieved by calling `sfUdpSocket_getLocalPort()`. +/// /// If there is no specific address to listen to, pass sfIpAddress_Any /// /// \param socket UDP socket object @@ -215,3 +219,12 @@ CSFML_NETWORK_API sfSocketStatus /// //////////////////////////////////////////////////////////// CSFML_NETWORK_API unsigned int sfUdpSocket_maxDatagramSize(void); + +//////////////////////////////////////////////////////////// +/// \brief Return the special value that tells the system +/// to pick any available port +/// +/// \return The value to use for any port +/// +//////////////////////////////////////////////////////////// +CSFML_NETWORK_API unsigned short sfUdpSocket_anyPort(void); diff --git a/src/CSFML/Network/IpAddress.cpp b/src/CSFML/Network/IpAddress.cpp index fa0ab2c1..60e0b60f 100644 --- a/src/CSFML/Network/IpAddress.cpp +++ b/src/CSFML/Network/IpAddress.cpp @@ -48,7 +48,7 @@ namespace //////////////////////////////////////////////////////////// -const sfIpAddress sfIpAddress_None = sfIpAddress_fromBytes(0, 0, 0, 0); +const sfIpAddress sfIpAddress_None = {{0}}; //////////////////////////////////////////////////////////// diff --git a/src/CSFML/Network/Packet.cpp b/src/CSFML/Network/Packet.cpp index f720d6f9..940ffd3b 100644 --- a/src/CSFML/Network/Packet.cpp +++ b/src/CSFML/Network/Packet.cpp @@ -156,6 +156,20 @@ uint32_t sfPacket_readUint32(sfPacket* packet) *packet >> value; return value; } +int64_t sfPacket_readInt64(sfPacket* packet) +{ + assert(packet); + int64_t value = 0; + *packet >> value; + return value; +} +uint64_t sfPacket_readUint64(sfPacket* packet) +{ + assert(packet); + uint64_t value = 0; + *packet >> value; + return value; +} float sfPacket_readFloat(sfPacket* packet) { assert(packet); @@ -219,6 +233,16 @@ void sfPacket_writeUint32(sfPacket* packet, uint32_t value) assert(packet); *packet << value; } +void sfPacket_writeInt64(sfPacket* packet, int64_t value) +{ + assert(packet); + *packet << value; +} +void sfPacket_writeUint64(sfPacket* packet, uint64_t value) +{ + assert(packet); + *packet << value; +} void sfPacket_writeFloat(sfPacket* packet, float value) { assert(packet); diff --git a/src/CSFML/Network/TcpListener.cpp b/src/CSFML/Network/TcpListener.cpp index 6cd35ec6..829bfaa4 100644 --- a/src/CSFML/Network/TcpListener.cpp +++ b/src/CSFML/Network/TcpListener.cpp @@ -86,6 +86,14 @@ sfSocketStatus sfTcpListener_listen(sfTcpListener* listener, unsigned short port } +//////////////////////////////////////////////////////////// +void sfTcpListener_close(sfTcpListener* listener) +{ + assert(listener); + listener->close(); +} + + //////////////////////////////////////////////////////////// sfSocketStatus sfTcpListener_accept(sfTcpListener* listener, sfTcpSocket** connected) { @@ -102,3 +110,10 @@ sfSocketStatus sfTcpListener_accept(sfTcpListener* listener, sfTcpSocket** conne return status; } + + +//////////////////////////////////////////////////////////// +unsigned short sfTcpListener_anyPort() +{ + return 0; +} diff --git a/src/CSFML/Network/UdpSocket.cpp b/src/CSFML/Network/UdpSocket.cpp index 31b31b5d..7f154209 100644 --- a/src/CSFML/Network/UdpSocket.cpp +++ b/src/CSFML/Network/UdpSocket.cpp @@ -203,3 +203,10 @@ unsigned int sfUdpSocket_maxDatagramSize() { return sf::UdpSocket::MaxDatagramSize; } + + +//////////////////////////////////////////////////////////// +unsigned short sfUdpSocket_anyPort() +{ + return 0; +} diff --git a/test/Network/IpAddress.test.cpp b/test/Network/IpAddress.test.cpp index b784ccbe..9e0183d5 100644 --- a/test/Network/IpAddress.test.cpp +++ b/test/Network/IpAddress.test.cpp @@ -2,6 +2,8 @@ #include +#include + TEST_CASE("[Network] sfIpAddress") { SECTION("Constants") @@ -10,6 +12,11 @@ TEST_CASE("[Network] sfIpAddress") CHECK(sfIpAddress_toInteger(sfIpAddress_Any) == 0); CHECK(sfIpAddress_toInteger(sfIpAddress_LocalHost) == 0x7F000001); CHECK(sfIpAddress_toInteger(sfIpAddress_Broadcast) == 0xFFFFFFFF); + + CHECK(std::strcmp(sfIpAddress_None.address, "") == 0); + CHECK(std::strcmp(sfIpAddress_Any.address, "0.0.0.0") == 0); + CHECK(std::strcmp(sfIpAddress_LocalHost.address, "127.0.0.1") == 0); + CHECK(std::strcmp(sfIpAddress_Broadcast.address, "255.255.255.255") == 0); } SECTION("sfIpAddress_fromString")