2019-04-22 21:03:00 +03:00
/*******************************************************************************************
2020-02-20 14:42:37 +03:00
*
* raylib [ network ] example - TCP Client
*
* This example has been created using raylib 3.0 ( www . raylib . com )
* raylib is licensed under an unmodified zlib / libpng license ( View raylib . h for details )
*
* Copyright ( c ) 2019 - 2020 Jak Barnes ( @ syphonx ) and Ramon Santamaria ( @ raysan5 )
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2019-04-22 21:03:00 +03:00
# include "raylib.h"
2020-02-20 14:42:37 +03:00
# define RNET_IMPLEMENTATION
2019-04-22 21:03:00 +03:00
# include "rnet.h"
2020-02-20 14:42:37 +03:00
int main ( void )
2019-04-22 21:03:00 +03:00
{
2020-02-20 14:42:37 +03:00
// Initialization
//--------------------------------------------------------------------------------------
const int screenWidth = 800 ;
const int screenHeight = 450 ;
2019-04-22 21:03:00 +03:00
2020-02-20 14:42:37 +03:00
InitWindow ( screenWidth , screenHeight , " raylib [network] example - tcp client " ) ;
2019-04-22 21:03:00 +03:00
2020-02-20 14:42:37 +03:00
InitNetworkDevice ( ) ; // Init network communications
const char * pingmsg = " Ping! " ;
const char * pongmsg = " Pong! " ;
bool ping = false ;
bool pong = false ;
float elapsed = 0.0f ;
float delay = 1.0f ;
bool connected = false ;
2019-04-22 21:03:00 +03:00
2020-02-20 14:42:37 +03:00
SocketConfig clientConfig = {
. host = " 127.0.0.1 " ,
. port = " 4950 " ,
. type = SOCKET_TCP ,
. nonblocking = true
} ;
SocketSet * socketSet = NULL ;
SocketResult * clientResult = NULL ;
char receiveBuffer [ 512 ] = { 0 } ;
2019-04-22 21:03:00 +03:00
2020-02-20 14:42:37 +03:00
// Create the client: getaddrinfo + socket + setsockopt + connect (TCP only)
clientResult = AllocSocketResult ( ) ;
if ( ! SocketCreate ( & clientConfig , clientResult ) ) TraceLog ( LOG_WARNING , " Failed to open client: status %d, errno %d " , clientResult - > status , clientResult - > socket - > status ) ;
else
{
if ( ! ( clientConfig . type = = SOCKET_UDP ) )
{
if ( ! SocketConnect ( & clientConfig , clientResult ) ) TraceLog ( LOG_WARNING , " Failed to connect to server: status %d, errno %d " , clientResult - > status , clientResult - > socket - > status ) ;
2019-08-03 12:07:41 +03:00
}
}
2019-04-22 21:03:00 +03:00
2020-02-20 14:42:37 +03:00
// Create and add sockets to the socket set
socketSet = AllocSocketSet ( 1 ) ;
AddSocket ( socketSet , clientResult - > socket ) ;
2019-04-22 21:03:00 +03:00
2020-02-20 14:42:37 +03:00
SetTargetFPS ( 60 ) ; // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
2019-04-22 21:03:00 +03:00
2019-08-03 12:07:41 +03:00
// Main game loop
2020-02-20 14:42:37 +03:00
while ( ! WindowShouldClose ( ) ) // Detect window close button or ESC key
{
// Update
//----------------------------------------------------------------------------------
if ( connected )
{
// Once connected to the network, check the sockets for pending information
// and when information is ready, send either a Ping or a Pong.
// CheckSockets, if any of the sockets in the socketSet are pending (received data, or requests)
// then mark the socket as being ready. You can check this with IsSocketReady(clientResult->socket)
int active = CheckSockets ( socketSet , 0 ) ;
if ( active ! = 0 ) TraceLog ( LOG_DEBUG , " There are currently %d socket(s) with data to be processed. " , active ) ;
// IsSocketReady, if the socket is ready, attempt to receive data from the socket
int bytesRecv = 0 ;
if ( IsSocketReady ( clientResult - > socket ) ) bytesRecv = SocketReceive ( clientResult - > socket , receiveBuffer , strlen ( pingmsg ) + 1 ) ;
// If we received data, was that data a "Ping!" or a "Pong!"
if ( bytesRecv > 0 )
{
if ( strcmp ( receiveBuffer , pingmsg ) = = 0 ) { pong = true ; }
if ( strcmp ( receiveBuffer , pongmsg ) = = 0 ) { ping = true ; }
}
// After each delay has expired, send a response "Ping!" for a "Pong!" and vice versa
elapsed + = GetFrameTime ( ) ;
if ( elapsed > delay )
{
if ( ping )
{
ping = false ;
SocketSend ( clientResult - > socket , pingmsg , strlen ( pingmsg ) + 1 ) ;
}
else if ( pong )
{
pong = false ;
SocketSend ( clientResult - > socket , pongmsg , strlen ( pingmsg ) + 1 ) ;
}
elapsed = 0.0f ;
}
}
else
{
// Check if we're connected every delay seconds
elapsed + = GetFrameTime ( ) ;
if ( elapsed > delay )
{
if ( IsSocketConnected ( clientResult - > socket ) ) { connected = true ; }
elapsed = 0.0f ;
}
2019-08-03 12:07:41 +03:00
}
2020-02-20 14:42:37 +03:00
//----------------------------------------------------------------------------------
// Draw
//----------------------------------------------------------------------------------
BeginDrawing ( ) ;
ClearBackground ( RAYWHITE ) ;
// TODO: Draw relevant connection info
2019-08-03 12:07:41 +03:00
EndDrawing ( ) ;
2020-02-20 14:42:37 +03:00
//----------------------------------------------------------------------------------
2019-08-03 12:07:41 +03:00
}
2019-04-22 21:03:00 +03:00
2020-02-20 14:42:37 +03:00
// De-Initialization
//--------------------------------------------------------------------------------------
CloseNetworkDevice ( ) ; // Close network communication
CloseWindow ( ) ; // Close window and OpenGL context
//--------------------------------------------------------------------------------------
2019-08-03 12:07:41 +03:00
return 0 ;
2019-04-22 21:03:00 +03:00
}