Unigine.Socket Class
Inherits: | Stream |
This class provides basic functionality for network interaction using stream sockets.
Usage Example
In this example we create UDP sockets: server and five clients.
- The server sends broadcast packets containing the ID of the receiving client.
- Each client processes only the messages, that were addressed to it.
- In the world's update() method the server sends messages addressed to clients 2 and 5.
In the AppWorldLogic.cs we do the following:
- First, we describe our client and server and declare server and array of clients.
- In the AppWorldLogic.init() method we initialize our clients.
- In the AppWorldLogic.update() we check which keys were pressed and send messages to corresponding clients:
- Client 2 - on ENTER key
- Client 5 - on WASD keys
//AppWorldLogic.cs
/* ... */
using System.Runtime.InteropServices;
using Unigine;
namespace UnigineApp
{
static class Constants
{
// UDP port to be used
public const int UDP_PORT = 8889;
// UDP receive buffer size
public const int RECV_SIZE = 7;
// UDP send buffer size
public const int SEND_SIZE = 7;
}
/// Class representing the Server Socket
class ServerSocket
{
Socket socket;
/// Server constructor
public ServerSocket() {
// creating a UDP socket
socket = new Socket(Socket.SOCKET_DGRAM);
// opening a socket on the specified port with a specified broadcast address
socket.open("127.255.255.255", Constants.UDP_PORT);
// setting the size of the sending buffer
socket.send(Constants.SEND_SIZE);
// setting the socket as a broadcasting one
socket.broadcast();
// setting the socket as a non-blocking one
socket.nonblock();
}
/// Server destructor
~ServerSocket()
{
// closing the socket
socket.close();
}
/// method sending a message to a certain client
public void send_message(short client_num, string message)
{
// preparing a message to be received by a client with a given client_id
Blob blob = new Blob();
blob.clear();
blob.writeShort(client_num);
blob.write(Marshal.StringToHGlobalUni(message), (uint) message.Length);
// getting message size
uint size = blob.getSize();
// setting current position to start
blob.seekSet(0);
// sending the message
socket.writeStream(blob.getStream(), size);
blob.clear();
}
};
/// Class representing the Client Socket
class ClientSocket {
Socket socket;
int id = 0;
/// Client constructor
public ClientSocket()
{
// creating a UDP socket
socket = new Socket(Socket.SOCKET_DGRAM);
// opening a socket on the specified port
socket.open(Constants.UDP_PORT);
// setting the size of the receiving buffer
socket.recv(Constants.RECV_SIZE);
// binding the socket to an address figured out from the host used for socket initialization
socket.bind();
// setting the socket as a non-blocking one
socket.nonblock();
}
/// Client destructor
~ClientSocket()
{
// closing the socket
socket.close();
}
public void setID(int num)
{
// setting client's ID
id = num;
}
/// method checking for received packes from the server
public int update()
{
// preparing a blob to read the message into
Blob temp_blob = new Blob();
temp_blob.clear();
// reading data from the socket
socket.readStream(temp_blob.getStream(), Constants.RECV_SIZE);
if (temp_blob.getSize() > 0)
{
// setting current position to start
temp_blob.seekSet(0);
// getting client's ID
short num_client = temp_blob.readShort();
// checking if the received message is addressed to this particular client and processing it
if (num_client == id)
Log.message("\nClient[{0}] - OPERATION_CODE: {1}", id, temp_blob.readLine());
}
return 1;
}
};
class AppWorldLogic : WorldLogic
{
//declaring server and client sockets
ServerSocket server_socket;
ClientSocket[] clients = new ClientSocket[5];
// World logic, it takes effect only when the world is loaded.
// These methods are called right after corresponding world script's (UnigineScript) methods.
public AppWorldLogic()
{
}
public override int init()
{
server_socket = new ServerSocket();
// Write here code to be called on world initialization: initialize resources for your world scene during the world start.
for (int i = 0; i < 5; i++)
{
clients[i] = new ClientSocket();
clients[i].setID(i + 1);
}
return 1;
}
// start of the main loop
public override int update()
{
// Write here code to be called before updating each render frame: specify all graphics-related functions you want to be called every frame while your application executes.
Controls controls = Game.get().getPlayer().getControls();
// sending messages on keys pressed to clients 2 and 5
if (controls.clearState(Controls.STATE_USE) == 1 )
server_socket.send_message(2, "S");
else if (controls.clearState(Controls.STATE_FORWARD) == 1)
server_socket.send_message(5, "F");
else if (controls.clearState(Controls.STATE_BACKWARD) == 1)
server_socket.send_message(5, "B");
else if (controls.clearState(Controls.STATE_MOVE_LEFT) == 1)
server_socket.send_message(5, "L");
else if (controls.clearState(Controls.STATE_MOVE_RIGHT) == 1)
server_socket.send_message(5, "R");
// updating clients
for (int i = 0; i < 5; i++)
clients[i].update();
return 1;
}
/* ... */
}
}
Socket Class
Members
static Socket(int type)
Creates a socket and opens it on a given port. When the socket receives data, packets from all network interfaces will be received. When the socket sends data, the default IP address will be used.Arguments
- int type - Port, on which the socket will be opened.
static Socket(int type, int port)
Creates a socket for TCP or UDP connections and opens it on a given port. When the socket receives data, packets from all network interfaces will be received. When the socket sends data, the default IP address will be used.Arguments
- int type - Socket for TCP (SOCKET_STREAM variable) or UDP (SOCKET_DGRAM) connections.
- int port - Port, on which the socket will be opened.
static Socket(int type, string host, int port)
Creates a socket for TCP or UDP connections and opens it on a given host and a given port. The host specifies the address, from and to which data will be sent.Arguments
- int type - Socket for TCP (SOCKET_STREAM variable) or UDP (SOCKET_DGRAM) connections.
- string host - Host, on which the socket will be opened.
- int port - Port, on which the socket will be opened.
Socket cast(Stream stream)
Arguments
- Stream stream
int getFD()
Returns the socket file descriptor.Return value
Socket file descriptor.string getHost()
Returns the host name on which the socket is opened.Return value
Host name.int getPort()
Returns the port number on which the socket is opened.Return value
Port number.int accept(Socket socket)
Accepts a connection on the socket.Arguments
- Socket socket - Socket that is bound to an address and listens to connections.
Return value
Returns 1 if the connection is accepted; otherwise, 0.int bind()
Binds the socket to an address figured out from the host used for socket initialization.Return value
Returns 1 if the address is bound; otherwise, 0.int block()
Sets up a blocking socket.Return value
1 if the socket is opened; otherwise, 0.int broadcast()
Sets up a broadcast socket. To create a broadcast socket, you need to create it with a broadcast host address first and then use this function.Return value
Returns 1 if the socket is set up successfully ; otherwise, 0 is returned.int close()
Closes the socket.int connect()
Initiates a connection on the socket.Return value
Returns 1 if the connection is initialized; otherwise, 0.int listen(int num)
Makes the socket listen to connections.Arguments
- int num - Maximum number of pending connections.
Return value
Returns 1 if the socket has started listening; otherwise, 0.int listenMulticastGroup()
Joins the socket to a multicast group. Available for UDP sockets only.The socket class doesn't allow creating a multicast server.
const int PORT = 8888;
Socket socket = new Socket(Socket.SOCKET_DGRAM, PORT);
socket.listenMulticastGroup();
Return value
1 if the sockect has been joined successfully; otherwise, 0.int nodelay()
Enables Nagle's algorithm.Return value
Returns 1 if the algorithm has been enabled successfully; otherwise, 0.int nonblock()
Makes the socket a non-blocking one.Return value
Returns 1 if the has become non-blocking; otherwise, 0.int open(int port)
Opens the socket on a given port. When the socket receives data, packets from all network interfaces will be received. When the socket sends data, the default IP address will be used.Arguments
- int port - Port number, on which the socket will be opened.
Return value
Returns 1 if the socket is opened successfully; otherwise, 0.int open(string host, int port)
Opens the socket on a given port. When the socket receives data, packets from all network interfaces will be received. When the socket sends data, the default IP address will be used.Arguments
- string host - Host name, on which the socket will be opened.
- int port - Port number, on which the socket will be opened.
Return value
Returns 1 if the socket is opened successfully; otherwise, 0.int recv(int size)
Resizes an internal receiving buffer for a socket.Arguments
- int size - Receive buffer size in bytes.
Return value
Returns 1 if the buffer is resized successfully; otherwise, 0.int send(int size)
Resizes an internal sending buffer for a socket.Arguments
- int size - Send buffer size in bytes.
Return value
Returns 1 if the buffer is resized successfully; otherwise, 0.int SOCKET_DGRAM
Description
Socket for UDP packets.int SOCKET_STREAM
Description
Socket for TCP packets.Last update: 2018-06-04
Help improve this article
Was this article helpful?
(or select a word/phrase and press Ctrl+Enter)