variables
{
// context to handle the state of the different connections
struct connectionContext
{
int connectionNumber;
};
dword gListeningSocket;
struct connectionContext connections[long];
char gBuffer[1500];
dword gConnectionCount;
}
on start
{
gConnectionCount = 0;
// open a socket and wait for the first data
gListeningSocket = UdpOpen( IP_Endpoint(0.0.0.0:40002) );
UdpReceiveFrom(gListeningSocket, gBuffer, elcount(gBuffer));
}
OnUdpReceiveFrom(dword socket, long result, IP_Endpoint remoteEndpoint, char buffer[], dword size)
{
if(socket == gListeningSocket)
{
// create a context for this connection and open a new socket for the
// next connection
UdpConnect(socket, remoteEndpoint);
connections[socket].connectionNumber = ++gConnectionCount;
gListeningSocket = UdpOpen( IP_Endpoint(0.0.0.0:40002) );
UdpReceiveFrom(gListeningSocket, gBuffer, elcount(gBuffer));
}
AnswerRequest(socket, buffer, size);
}
AnswerRequest(dword socket, char buffer[], dword size)
{
char response[100];
if(strncmp(buffer, "Request", size) == 0)
{
snprintf(response, elcount(response), "Response for connection #%d", connections[socket].connectionNumber);
UdpSend(socket, response, strlen(response));
UdpReceiveFrom(socket, gBuffer, elcount(gBuffer));
}
else if(strncmp(buffer, "End", size) == 0)
{
connections.remove(socket);
UdpClose(socket);
}
}