forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								package kha.netsync;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import haxe.io.Bytes;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@:headerCode("
							 | 
						||
| 
								 | 
							
								#include <kinc/network/socket.h>
							 | 
						||
| 
								 | 
							
								")
							 | 
						||
| 
								 | 
							
								@:headerClassCode("kinc_socket_t socket;")
							 | 
						||
| 
								 | 
							
								class Network {
							 | 
						||
| 
								 | 
							
									var url: String;
							 | 
						||
| 
								 | 
							
									var port: Int;
							 | 
						||
| 
								 | 
							
									var bufferPos: Int;
							 | 
						||
| 
								 | 
							
									var buffer: Bytes;
							 | 
						||
| 
								 | 
							
									var tempBuffer: Bytes;
							 | 
						||
| 
								 | 
							
									var listener: Bytes->Void;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function new(url: String, port: Int, errorCallback: Void->Void, closeCallback: Void->Void) {
							 | 
						||
| 
								 | 
							
										this.url = url;
							 | 
						||
| 
								 | 
							
										this.port = port + 1; // TODO: This is somewhat ugly, but necessary to maintain both websocket and UPD connections at the same time (see also Server.hx)
							 | 
						||
| 
								 | 
							
										bufferPos = 0;
							 | 
						||
| 
								 | 
							
										buffer = Bytes.alloc(256); // TODO: Size
							 | 
						||
| 
								 | 
							
										tempBuffer = Bytes.alloc(256); // TODO: Size
							 | 
						||
| 
								 | 
							
										init(url, port);
							 | 
						||
| 
								 | 
							
										kha.Scheduler.addFrameTask(update, 0);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("
							 | 
						||
| 
								 | 
							
										kinc_socket_init(&socket);
							 | 
						||
| 
								 | 
							
										kinc_socket_options options;
							 | 
						||
| 
								 | 
							
										kinc_socket_options_set_defaults(&options);
							 | 
						||
| 
								 | 
							
										kinc_socket_set(&socket, \"127.0.0.1\", port, KINC_SOCKET_FAMILY_IP4, KINC_SOCKET_PROTOCOL_UDP);
							 | 
						||
| 
								 | 
							
										kinc_socket_open(&socket, &options);
							 | 
						||
| 
								 | 
							
									")
							 | 
						||
| 
								 | 
							
									public function init(url: String, port: Int) {
							 | 
						||
| 
								 | 
							
										send(Bytes.ofString("JOIN"), true); // TODO: Discuss, dependency with Server.hx
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("
							 | 
						||
| 
								 | 
							
										// TODO: mandatory
							 | 
						||
| 
								 | 
							
										kinc_socket_send_url(&socket, url, port, (const unsigned char*)bytes->b->getBase(), bytes->length);
							 | 
						||
| 
								 | 
							
									")
							 | 
						||
| 
								 | 
							
									public function send(bytes: Bytes, mandatory: Bool): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function listen(listener: Bytes->Void): Void {
							 | 
						||
| 
								 | 
							
										this.listener = listener;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function update() {
							 | 
						||
| 
								 | 
							
										var received = getBytesFromSocket(tempBuffer);
							 | 
						||
| 
								 | 
							
										buffer.blit(bufferPos, tempBuffer, 0, received);
							 | 
						||
| 
								 | 
							
										bufferPos += received;
							 | 
						||
| 
								 | 
							
										// if (received > 0) trace("received " + received + " bytes");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// TODO: Handle partial packets, don't choke on garbage
							 | 
						||
| 
								 | 
							
										if (listener != null && bufferPos > 0) {
							 | 
						||
| 
								 | 
							
											var result = Bytes.alloc(bufferPos);
							 | 
						||
| 
								 | 
							
											result.blit(0, buffer, 0, bufferPos);
							 | 
						||
| 
								 | 
							
											listener(result);
							 | 
						||
| 
								 | 
							
											bufferPos = 0;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("
							 | 
						||
| 
								 | 
							
										unsigned int recAddr;
							 | 
						||
| 
								 | 
							
										unsigned int recPort;
							 | 
						||
| 
								 | 
							
										int size = kinc_socket_receive(&socket, (unsigned char*)inBuffer->b->getBase(), inBuffer->length, &recAddr, &recPort);
							 | 
						||
| 
								 | 
							
										if (size >= 0) {
							 | 
						||
| 
								 | 
							
											return size;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										else {
							 | 
						||
| 
								 | 
							
											return 0;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									")
							 | 
						||
| 
								 | 
							
									function getBytesFromSocket(inBuffer: Bytes): Int {
							 | 
						||
| 
								 | 
							
										return 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |