This commit is contained in:
xdrm-brackets 2017-04-06 12:03:46 +02:00
commit 470eaf2610
33 changed files with 2390 additions and 1341 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/command-terminal/CommandTerminal/nbproject/private/
/command-terminal/CommandTerminal/build/

View File

@ -12,12 +12,12 @@ lib/network/tcp/server.o: lib/header.h lib/network/tcp/server.h lib/network/tcp/
lib/network/udp/server.o: lib/header.h lib/network/udp/server.h lib/network/udp/server.c
gcc $(CFLAGS) -c -o lib/network/udp/server.o lib/network/udp/server.c
lib/util.o: lib/util.h lib/util.c
gcc $(CFLAGS) -c -o lib/util.o lib/util.c
lib/network/format/serializer.o: lib/network/format/serializer.h lib/network/format/serializer.c
gcc $(CFLAGS) -c -o lib/network/format/serializer.o lib/network/format/serializer.c
# Compiles the SGCA
boot: lib/network/tcp/server.o lib/network/udp/server.o lib/util.o central-manager.h central-manager.c
gcc $(CFLAGS) -o boot lib/network/udp/server.o lib/network/tcp/server.o lib/util.o central-manager.c
boot: lib/network/tcp/server.o lib/network/udp/server.o lib/network/format/serializer.o central-manager.h central-manager.c
gcc $(CFLAGS) -o boot lib/network/udp/server.o lib/network/tcp/server.o lib/network/format/serializer.o central-manager.c
# Run full compilation

View File

@ -5,15 +5,11 @@
* @argv : {0:program name}
*
* @history
* [0] Initialisation des variables
* [1] On démarre le SERVEUR TCP d'écoute globale
* [2] On démarre le SERVEUR UDP d'écoute globale
* repeat:
* [3] Attente d'une demande de connection TCP -> création d'un THREAD
* [4] Attente d'une demande de connection UDP -> création d'un THREAD
* si SIGINT:
* [3] On attends la fin de tous les THREADS
* [4] On ferme la SOCKET d'écoute globale
* [1] Lancement des THREADS d'écoute
* 1. On démarre le SERVEUR TCP d'écoute globale
* 2. On démarre le SERVEUR UDP d'écoute globale
* [2] On attends la fin de tous les THREADS
* [3] On ferme la SOCKET d'écoute globale
*
*/
int main(int argc, char* argv[]){
@ -35,13 +31,16 @@ int main(int argc, char* argv[]){
pthread_join(listenManagers[0], NULL);
pthread_join(listenManagers[1], NULL);
/* [4] On ferme la SOCKET d'écoute globale
/* [3] On ferme la SOCKET d'écoute globale
==========================================================*/
printf("FERMETURE DE TOUTES LES CONNECTIONS!\n");
}
/* Attente de connection TCP
*
* @history
@ -136,6 +135,9 @@ void* LISTEN_TCP(){
/* Attente de connection UDP
*
* @history
@ -262,7 +264,15 @@ void* managePlane(void* THREADABLE_SOCKET){
break;
}
printf("\t\tRequest(%d bytes) : '%s'\n", read, request);
/* 3. On désérialise la requête*/
printf("\t\tPLANE Request(%d bytes) : '%s'\n", read, request);
/* [3] Gestion de la requête
=========================================================*/
}while( 0 );

View File

@ -1,13 +1,11 @@
#include "lib/header.h"
#include "lib/plane/plane.h"
/* local dependencies */
#include "lib/util.h"
#include "lib/network/tcp/server.h"
#include "lib/network/udp/server.h"
#include "lib/network/format/serializer.h"
/* headers */

View File

@ -0,0 +1,64 @@
#include "serializer.h"
int parse_plane_request(const char* pIn, struct plane_request* pOut){
/* 1. Check buffer length */
if( strlen(pIn)*sizeof(char) != sizeof(struct plane_request) )
return -1;
/* 2. Parse buffer */
memcpy(pOut, pIn, (size_t) sizeof(struct plane_request));
return 0;
}
int parse_viewterm_request(const char* pIn, struct vterm_request* pOut){
/* 1. Check buffer length */
if( strlen(pIn)*sizeof(char) != sizeof(struct vterm_request) )
return -1;
/* 2. Parse buffer */
memcpy(pOut, pIn, sizeof(struct vterm_request));
return 0;
}
int parse_ctrlterm_request(const char* pIn, struct cterm_request* pOut){
/* 1. Check buffer length */
if( strlen(pIn)*sizeof(char) != sizeof(struct cterm_request) )
return -1;
/* 2. Parse buffer */
memcpy(pOut, pIn, sizeof(struct cterm_request));
return 0;
}
int serialize_term_response(const struct term_response* pIn, char* pOut, const size_t pSize){
/* 1. Check buffer length */
if( sizeof(struct term_response) > pSize*sizeof(char) )
return -1;
/* 2. Serialize response into buffer */
memcpy(pOut, pIn, sizeof(struct term_response));
return 0;
}

View File

@ -1,35 +1,66 @@
#ifndef _LIB_NETWORK_FORMAT_SERIALIZER_H_
#define _LIB_NETWORK_FORMAT_SERIALIZER_H_
#include <string.h>
#include "../../plane/plane.h"
#define SGCA_PLANE 0x01
#define SGCA_VIEWTERM 0x02
#define SGCA_CTRLTERM 0x04
struct plane_request{ // Plane Request
struct coord co;
struct control ct;
};
#include "../../header.h";
struct view{
int x;
int y;
int z;
int cap;
int speed;
char id[6];
}; // 26 bytes
struct ctrl{
int cap;
int speed;
int z;
}; // 12 bytes
struct netflow{
char type;
struct vterm_request{ // ViewTerminal Request
char flags;
char data[39];
} // 41 bytes
};
struct term_response{ // Terminal-s Response
char flags;
struct coord co;
struct control ct;
};
struct cterm_request{ // ControlTerminal Request
char flags;
int z;
struct control ct;
};
/* Parse a plane request ('char*' to 'struct plane_request')
*
* @history
* [1] Check if buffer have correct size (according to destination struct)
* [2] Parse buffer to struct
*
*/
int parse_plane_request(const char* pIn, struct plane_request* pOut);
/* Parse a viewTerminal request ('char*' to 'struct vt_request')
*
* @history
* [1] Check if buffer have correct size (according to destination struct)
* [2] Parse buffer to struct
*
*/
int parse_viewterm_request(const char* pIn, struct vterm_request* pOut);
/* Parse a ctrlTerminal request ('char*' to 'struct ct_request')
*
* @history
* [1] Check if buffer have correct size (according to destination struct)
* [2] Parse buffer to struct
*
*/
int parse_ctrlterm_request(const char* pIn, struct cterm_request* pOut);
/* Serialize a Terminal response ('struct t_response' to 'char*')
*
* @history
* [1] Check if buffer have correct size (according to input struct)
* [2] Serialize struct into buffer
*
*/
int serialize_term_response(const struct term_response* pIn, char* pOut, const size_t pSize);
>>>>>>> d647392d99c86e94aa550f6cf0e7f284c4b226a3
#endif

View File

@ -1 +0,0 @@
../../../global/plane.c

View File

@ -1 +1 @@
../../../global/plane.h
../../../plane/plane.h

View File

@ -1,104 +0,0 @@
#include "util.h"
int swrite(int* pSocket, char* pBuffer){
if( *pSocket == -1 ) return -1; // si SOCKET fermée, on retourne une erreur
if( strlen(pBuffer) == 0 ) return 0; // si on a rien à écrire, on n'écrit rien :p
/* 1. On écrit sur la SOCKET */
if( DEBUGMOD&BUF ) printf("SENDLEN_1: %lu\n", strlen(pBuffer));
int nbSent = write(*pSocket, pBuffer, strlen(pBuffer));
if( DEBUGMOD&BUF ) printf("SENDLEN_2: %d\n", nbSent);
/* 2. Si on est déconnecté, on retourne une erreur */
if( nbSent <= 0 ){
if( DEBUGMOD&BUF ) printf("NOTHING TO SEND\n");
return -1; // on retourne une erreur
}
if( DEBUGMOD&RVL ) printf("SEND_1\n");
if( DEBUGMOD&RVL ) revealString(pBuffer);
if( DEBUGMOD&RVL ) printf("SEND_2\n");
/* 3. On retourne le nombre de <char> envoyés */
return nbSent;
}
int sread(int* pSocket, char* pBuffer){
if( *pSocket == -1 ) return -1; // si SOCKET fermée, on retourne une erreur
/* 1. On vide le buffer avant de lire */
memset(pBuffer, '\0', MAX_BUF_LEN);
if( DEBUGMOD&BUF ) printf("READLEN_1: %lu\n", strlen(pBuffer));
/* 2. On lit la SOCKET */
int nbRead = read(*pSocket, pBuffer, MAX_BUF_LEN);
if( DEBUGMOD&BUF ) printf("READLEN_3: %d\n", nbRead);
/* 3. Si on est déconnecté, on retourne une erreur */
if( nbRead <= 0 ){
if( DEBUGMOD&BUF ) printf("NOTHING TO READ\n");
return -1; // on retourne une erreur
}
if( DEBUGMOD&RVL ) printf("READ_1\n");
if( DEBUGMOD&RVL ) revealString(pBuffer);
if( DEBUGMOD&RVL ) printf("READ_2\n");
/* 4. On retourne le nombre de caractères lus */
return nbRead;
}
void setSocketTimeout(int* pSocket, const int pSec, const int pUSec){
/* 1. On créé la structure contenant le timeout */
struct timeval timeout;
timeout.tv_sec = pSec;
timeout.tv_usec = pUSec;
setsockopt(*pSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(struct timeval));
if( DEBUGMOD&SCK ) printf("Set socket(%d) timeout to %lus\n", *pSocket, (long unsigned) timeout.tv_sec );
}
void xPrint(char* pPattern, char* pBuffer){
char tmpBuffer[MAX_BUF_LEN];
strcpy(tmpBuffer, pBuffer);
int i;
// on supprimes les retours à la ligne de la fin
for( i = strlen(tmpBuffer)-1 ; i >= 0 && tmpBuffer[i] != '\0' ; i-- )
if( tmpBuffer[i] == '\n' || tmpBuffer[i] == '\r' ) // si c'est un retour chariot
tmpBuffer[i] = '\0'; // on efface
else
break;
printf(pPattern, pBuffer);
}
void revealString(char* pString){
/* 1. On créé une copie de @pString */
char revealedString[MAX_BUF_LEN] = {0};
/* 2. On rend visible tous les caractères "invisibles" */
int i;
for( i = 0 ; i < strlen(pString) && pString[i] != '\0' ; i++ ){
if( pString[i] == '\r' ){ revealedString[strlen(revealedString)] = '\\'; revealedString[strlen(revealedString)] = 'r'; }
else if( pString[i] == '\n' ){ revealedString[strlen(revealedString)] = '\\'; revealedString[strlen(revealedString)] = 'n'; }
else revealedString[strlen(revealedString)] = pString[i];
revealedString[strlen(revealedString)] = '\0';
}
/* 3. On affiche la chaîne explicite */
if( DEBUGMOD&RVL ) printf("[[%s]]\n", revealedString);
}

View File

@ -1,29 +0,0 @@
#include "header.h"
void setSocketTimeout(int* pSocket, const int pSec, const int pUSec);
/* read/write socket */
int swrite(int* pSocket, char* pBuffer);
int sread(int* pSocket, char* pBuffer);
/* Affiche une string en supprimant les retours à la ligne de fin de chaînes
*
* @pPattern<char*> Schéma du print (1er arg)
* @pBuffer<char*> Buffer en question
*
*/
void xPrint(char* pPattern, char* pBuffer);
/* Révèle les caractères spéciaux d'une string
*
* @pString<char*> La string à révéler
*
*
* @print explicitString<char*> On affiche la chaîne explicité
*
*/
void revealString(char* pString);

View File

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- You may freely edit this file. See commented blocks below for -->
<!-- some examples of how to customize the build. -->
<!-- (If you delete it and reopen the project it will be recreated.) -->
<!-- By default, only the Clean and Build commands use this build script. -->
<!-- Commands such as Run, Debug, and Test only use this build script if -->
<!-- the Compile on Save feature is turned off for the project. -->
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
<!-- in the project's Project Properties dialog box.-->
<project name="CommandTerminal" default="default" basedir=".">
<description>Builds, tests, and runs the project CommandTerminal.</description>
<import file="nbproject/build-impl.xml"/>
<!--
There exist several targets which are by default empty and which can be
used for execution of your tasks. These targets are usually executed
before and after some main targets. They are:
-pre-init: called before initialization of project properties
-post-init: called after initialization of project properties
-pre-compile: called before javac compilation
-post-compile: called after javac compilation
-pre-compile-single: called before javac compilation of single file
-post-compile-single: called after javac compilation of single file
-pre-compile-test: called before javac compilation of JUnit tests
-post-compile-test: called after javac compilation of JUnit tests
-pre-compile-test-single: called before javac compilation of single JUnit test
-post-compile-test-single: called after javac compilation of single JUunit test
-pre-jar: called before JAR building
-post-jar: called after JAR building
-post-clean: called after cleaning build products
(Targets beginning with '-' are not intended to be called on their own.)
Example of inserting an obfuscator after compilation could look like this:
<target name="-post-compile">
<obfuscate>
<fileset dir="${build.classes.dir}"/>
</obfuscate>
</target>
For list of available properties check the imported
nbproject/build-impl.xml file.
Another way to customize the build is by overriding existing main targets.
The targets of interest are:
-init-macrodef-javac: defines macro for javac compilation
-init-macrodef-junit: defines macro for junit execution
-init-macrodef-debug: defines macro for class debugging
-init-macrodef-java: defines macro for class execution
-do-jar: JAR building
run: execution of project
-javadoc-build: Javadoc generation
test-report: JUnit report generation
An example of overriding the target for project execution could look like this:
<target name="run" depends="CommandTerminal-impl.jar">
<exec dir="bin" executable="launcher.exe">
<arg file="${dist.jar}"/>
</exec>
</target>
Notice that the overridden target depends on the jar target and not only on
the compile target as the regular run target does. Again, for a list of available
properties which you can use, check the target you are overriding in the
nbproject/build-impl.xml file.
-->
</project>

View File

@ -0,0 +1,3 @@
Manifest-Version: 1.0
X-COMMENT: Main-Class will be added automatically by build

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,8 @@
build.xml.data.CRC32=fdad8e2e
build.xml.script.CRC32=1cd81838
build.xml.stylesheet.CRC32=8064a381@1.74.1.48
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=fdad8e2e
nbproject/build-impl.xml.script.CRC32=95faf5a3
nbproject/build-impl.xml.stylesheet.CRC32=876e7a8f@1.74.1.48

View File

@ -0,0 +1,73 @@
annotation.processing.enabled=true
annotation.processing.enabled.in.editor=false
annotation.processing.processor.options=
annotation.processing.processors.list=
annotation.processing.run.all.processors=true
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
build.classes.dir=${build.dir}/classes
build.classes.excludes=**/*.java,**/*.form
# This directory is removed when the project is cleaned:
build.dir=build
build.generated.dir=${build.dir}/generated
build.generated.sources.dir=${build.dir}/generated-sources
# Only compile against the classpath explicitly listed here:
build.sysclasspath=ignore
build.test.classes.dir=${build.dir}/test/classes
build.test.results.dir=${build.dir}/test/results
# Uncomment to specify the preferred debugger connection transport:
#debug.transport=dt_socket
debug.classpath=\
${run.classpath}
debug.test.classpath=\
${run.test.classpath}
# Files in build.classes.dir which should be excluded from distribution jar
dist.archive.excludes=
# This directory is removed when the project is cleaned:
dist.dir=dist
dist.jar=${dist.dir}/CommandTerminal.jar
dist.javadoc.dir=${dist.dir}/javadoc
excludes=
includes=**
jar.compress=false
javac.classpath=
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false
javac.processorpath=\
${javac.classpath}
javac.source=1.8
javac.target=1.8
javac.test.classpath=\
${javac.classpath}:\
${build.classes.dir}
javac.test.processorpath=\
${javac.test.classpath}
javadoc.additionalparam=
javadoc.author=false
javadoc.encoding=${source.encoding}
javadoc.noindex=false
javadoc.nonavbar=false
javadoc.notree=false
javadoc.private=false
javadoc.splitindex=true
javadoc.use=true
javadoc.version=false
javadoc.windowtitle=
main.class=commandterminal.CommandTerminal
manifest.file=manifest.mf
meta.inf.dir=${src.dir}/META-INF
mkdist.disabled=false
platform.active=default_platform
run.classpath=\
${javac.classpath}:\
${build.classes.dir}
# Space-separated list of JVM arguments used when running the project.
# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
# To set system properties for unit tests define test-sys-prop.name=value:
run.jvmargs=
run.test.classpath=\
${javac.test.classpath}:\
${build.test.classes.dir}
source.encoding=UTF-8
src.dir=src
test.src.dir=test

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.java.j2seproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
<name>CommandTerminal</name>
<source-roots>
<root id="src.dir"/>
</source-roots>
<test-roots>
<root id="test.src.dir"/>
</test-roots>
</data>
</configuration>
</project>

View File

@ -0,0 +1,75 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package DatagramSocket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author lmascaro
*/
public class AsynchronousDatagramSocket implements Runnable, AutoCloseable{
private final static int MAX_MESSAGE_SIZE = 300;
private SynchronizedBuffer<DatagramPacket> buf;
private DatagramSocket socket;
public AsynchronousDatagramSocket() throws SocketException{
this.buf = new SynchronizedBuffer<>();
this.socket = new DatagramSocket();
new Thread(this).start();
}
public AsynchronousDatagramSocket(int port) throws SocketException{
this.buf = new SynchronizedBuffer<>();
this.socket = new DatagramSocket(port);
new Thread(this).start();
}
public void send(DatagramPacket dp) throws IOException{
this.socket.send(dp);
}
public boolean asynchronousReceive(DatagramPacket dp){
if(this.buf.available() == 0){
return false;
}else{
dp = this.buf.removeElement(false);
return true;
}
}
public void synchronousReceive(DatagramPacket dp){
dp = this.buf.removeElement(true);
}
public boolean available(){
return this.buf.available()>0;
}
@Override
public void close(){
this.socket.close();
}
@Override
public void run() {
DatagramPacket packet = new DatagramPacket(new byte[MAX_MESSAGE_SIZE],MAX_MESSAGE_SIZE);
try {
this.socket.receive(packet);
this.buf.addElement(packet);
} catch (IOException ex) {
Logger.getLogger(AsynchronousDatagramSocket.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

View File

@ -0,0 +1,46 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package DatagramSocket;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author lmascaro
*/
public class SynchronizedBuffer<T>{
private LinkedList<T> elements = new LinkedList<T>();
public synchronized T removeElement(boolean sync){
if(!sync && this.elements.isEmpty()){
return null;
}
while(this.elements.isEmpty()){
try {
this.wait();
} catch (InterruptedException ex) {
Logger.getLogger(SynchronizedBuffer.class.getName()).log(Level.SEVERE, null, ex);
}
}
return this.elements.removeFirst();
}
public synchronized void addElement(T elem){
this.elements.add(elem);
this.notifyAll();
}
public synchronized int available(){
return this.elements.size();
}
}

View File

@ -0,0 +1,122 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package commandterminal;
import DatagramSocket.AsynchronousDatagramSocket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.nio.ByteBuffer;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author lmascaro
*/
public class CommandTerminal {
private final static int SGCA_BROADCAST_PORT = 9999;
private final static int MAX_MESSAGE_SIZE = 300;
private static AsynchronousDatagramSocket socket;
/**
* @param args the command line arguments
*/
public static void main(String[] args){
//the following code go through every interfaces to get broadcasts addresses in order to contact the sgca
HashSet<InetAddress> listOfBroadcasts = new HashSet<InetAddress>();
Enumeration list;
try {
list = NetworkInterface.getNetworkInterfaces();
while(list.hasMoreElements()) {
NetworkInterface iface = (NetworkInterface) list.nextElement();
if(iface == null) continue;
//if the interface is not loopback
if(!iface.isLoopback() && iface.isUp()) {
Iterator it = iface.getInterfaceAddresses().iterator();
while (it.hasNext()) {
InterfaceAddress address = (InterfaceAddress) it.next();
if(address == null) continue;
InetAddress broadcast = address.getBroadcast();
if(broadcast != null)
{
//we found it !
listOfBroadcasts.add(broadcast);
}
}
}
}
} catch (SocketException ex) {
System.err.println("Error while getting network interfaces");
return;
}
Integer sgcaPort;
InetAddress sgcaAddress;
DatagramPacket packet;
try {
//try to send a request to all the broadcasts (usually there is only one) and wait for the response of the sgca
DatagramSocket broadcastSocket = new DatagramSocket();
byte[] data;
for(InetAddress adr : listOfBroadcasts){
data = new byte[1];
Integer clientType = 1;
data[0] = clientType.byteValue();
packet = new DatagramPacket(data,data.length,adr,SGCA_BROADCAST_PORT);
broadcastSocket.send(packet);
}
data = new byte[1];
packet = new DatagramPacket(data,data.length);
broadcastSocket.receive(packet);
sgcaAddress = packet.getAddress();
Byte b = new Byte(packet.getData()[0]);
sgcaPort = b.intValue();
} catch (Exception ex) {
Logger.getLogger(CommandTerminal.class.getName()).log(Level.SEVERE, null, ex);
return;
}
//from now we assume that the network discovery part went well and we have the port/address of the sgca
//send a ISALIVE to ensure the sgca is ready to receive commands
DatagramSocket comSock;
ByteBuffer buf = ByteBuffer.allocate(1);
try {
comSock = new DatagramSocket(sgcaPort);
buf.putInt(OpCode.ISALIVE.ordinal());
packet = new DatagramPacket(buf.array(),buf.arrayOffset(),sgcaAddress,sgcaPort);
comSock.send(packet);
//receive response
comSock.receive(packet);
Byte response = new Byte(packet.getData()[0]);
OpCode success = OpCode.values()[response.intValue()];
if(success != OpCode.SUCCESS){
System.out.println("SGCA Not ready, exiting");
return;
}
} catch (Exception ex) {
Logger.getLogger(CommandTerminal.class.getName()).log(Level.SEVERE, null, ex);
}
//now the sgca is connected and ready, let's start the real work
}
}

View File

@ -0,0 +1,20 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package commandterminal;
/**
*
* @author lmascaro
*/
public enum OpCode {
ISALIVE,
CAP,
ALT,
SPEED,
SUCCESS,
ERROR
}

26
plane/Makefile Normal file
View File

@ -0,0 +1,26 @@
CFLAGS=-Wall
# Runs 'all' depenency as default / i.e. 'make' command will run 'make all' implicitly
default: all
lib/network/tcp/client.o: lib/header.h lib/network/tcp/client.h lib/network/tcp/client.c
gcc $(CFLAGS) -c -o lib/network/tcp/client.o lib/network/tcp/client.c
lib/network/format/serializer.o: lib/network/format/serializer.h lib/network/format/serializer.c
gcc $(CFLAGS) -c -o lib/network/format/serializer.o lib/network/format/serializer.c
# Compiles the Plane
boot: lib/network/tcp/client.o lib/network/format/serializer.o plane.h plane.c
gcc $(CFLAGS) -o boot lib/network/tcp/client.o lib/network/format/serializer.o plane.c -lm
# Run full compilation
all: boot
# cleans the compiled files
clean:
rm boot;
rm ./**/*.o

View File

@ -1,500 +0,0 @@
<!DOCTYPE html>
<html>
<head data-suburl="">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="author" content="xdrm-brackets" />
<meta name="description" content="proxy.ftp.c" />
<meta name="keywords" content="go, git, self-hosted, gogs">
<meta name="referrer" content="no-referrer" />
<meta name="_csrf" content="oL9HDhjy3U7tPSwjawLkQB4VNfA6MTQ5MDcxOTc2NTY0Nzg0MDkyNQ==" />
<meta name="_suburl" content="" />
<meta property="og:url" content="https://git.xdrm.io/xdrm-brackets/proxy.ftp.c" />
<meta property="og:type" content="object" />
<meta property="og:title" content="xdrm-brackets/proxy.ftp.c">
<meta property="og:description" content="">
<link rel="shortcut icon" href="/img/favicon.png" />
<script src="/js/jquery-1.11.3.min.js"></script>
<script src="/js/libs/jquery.are-you-sure.js"></script>
<link rel="stylesheet" href="/assets/font-awesome-4.6.3/css/font-awesome.min.css">
<link rel="stylesheet" href="/assets/octicons-4.3.0/octicons.min.css">
<link rel="stylesheet" href="/css/semantic-2.2.7.min.css">
<link rel="stylesheet" href="/css/gogs.css?v=73519fd9811805bce6fc4aa2d24bb413">
<script src="/js/semantic-2.2.7.min.js"></script>
<script src="/js/gogs.js?v=73519fd9811805bce6fc4aa2d24bb413"></script>
<title>xdrm-brackets/proxy.ftp.c - xdrm-brackets&#39; git server</title>
<meta name="theme-color" content="#ff5343">
</head>
<body>
<div class="full height">
<noscript>Please enable JavaScript in your browser!</noscript>
<div class="following bar light">
<div class="ui container">
<div class="ui grid">
<div class="column">
<div class="ui top secondary menu">
<a class="item brand" href="/">
<img class="ui mini image" src="/img/favicon.png">
</a>
<a class="item" href="/">Home</a>
<a class="item" href="/explore/repos">Explore</a>
<a class="item" target="_blank" href="https://gogs.io/docs" rel="noreferrer">Help</a>
<div class="right menu">
<a class="item" href="/user/sign_up">
<i class="octicon octicon-person"></i> Register
</a>
<a class="item" href="/user/login?redirect_to=%2fxdrm-brackets%2fproxy.ftp.c%2fsrc%2fmaster%2fdep%2fclient.c">
<i class="octicon octicon-sign-in"></i> Sign In
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="repository file list">
<div class="header-wrapper">
<div class="ui container">
<div class="ui vertically padded grid head">
<div class="column">
<div class="ui header">
<div class="ui huge breadcrumb">
<i class="mega-octicon octicon-repo"></i>
<a href="/xdrm-brackets">xdrm-brackets</a>
<div class="divider"> / </div>
<a href="/xdrm-brackets/proxy.ftp.c">proxy.ftp.c</a>
</div>
<div class="ui right">
<div class="ui labeled button" tabindex="0">
<a class="ui button" href="/xdrm-brackets/proxy.ftp.c/action/watch?redirect_to=%2fxdrm-brackets%2fproxy.ftp.c%2fsrc%2fmaster%2fdep%2fclient.c">
<i class="icon fa-eye-slash"></i>Watch
</a>
<a class="ui basic label" href="/xdrm-brackets/proxy.ftp.c/watchers">
1
</a>
</div>
<div class="ui labeled button" tabindex="0">
<a class="ui button" href="/xdrm-brackets/proxy.ftp.c/action/star?redirect_to=%2fxdrm-brackets%2fproxy.ftp.c%2fsrc%2fmaster%2fdep%2fclient.c">
<i class="icon fa-star-o"></i>Star
</a>
<a class="ui basic label" href="/xdrm-brackets/proxy.ftp.c/stars">
0
</a>
</div>
<div class="ui labeled button" tabindex="0">
<a class="ui button " href="/repo/fork/49">
<i class="octicon octicon-repo-forked"></i>Fork
</a>
<a class="ui basic label" href="/xdrm-brackets/proxy.ftp.c/forks">
0
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="ui tabs container">
<div class="ui tabular menu navbar">
<a class="active item" href="/xdrm-brackets/proxy.ftp.c">
<i class="octicon octicon-file-text"></i> Files
</a>
<a class=" item" href="/xdrm-brackets/proxy.ftp.c/issues">
<i class="octicon octicon-issue-opened"></i> Issues <span class="ui gray small label">0</span>
</a>
<a class=" item" href="/xdrm-brackets/proxy.ftp.c/pulls">
<i class="octicon octicon-git-pull-request"></i> Pull Requests <span class="ui gray small label">0</span>
</a>
<a class=" item" href="/xdrm-brackets/proxy.ftp.c/commits/master">
<i class="octicon octicon-history"></i> Commits <span class="ui blue small label">23</span>
</a>
<a class=" item" href="/xdrm-brackets/proxy.ftp.c/releases">
<i class="octicon octicon-tag"></i> Releases <span class="ui gray small label">0</span>
</a>
<a class=" item" href="/xdrm-brackets/proxy.ftp.c/wiki">
<i class="octicon octicon-book"></i> Wiki
</a>
</div>
</div>
<div class="ui tabs divider"></div>
</div>
<div class="ui container">
<p id="repo-desc">
<span class="no-description text-italic">No Description</span>
<a class="link" href=""></a>
</p>
<div class="ui secondary menu">
<div class="fitted item choose reference">
<div class="ui floating filter dropdown" data-no-results="No results found.">
<div class="ui basic small button">
<span class="text">
<i class="octicon octicon-git-branch"></i>
Branch:
<strong>master</strong>
</span>
<i class="dropdown icon"></i>
</div>
<div class="menu">
<div class="ui icon search input">
<i class="filter icon"></i>
<input name="search" placeholder="Filter branch or tag...">
</div>
<div class="header">
<div class="ui grid">
<div class="two column row">
<a class="reference column" href="#" data-target="#branch-list">
<span class="text black">
<i class="octicon octicon-git-branch"></i> Branches
</span>
</a>
<a class="reference column" href="#" data-target="#tag-list">
<span class="text ">
<i class="reference tags icon"></i> Tags
</span>
</a>
</div>
</div>
</div>
<div id="branch-list" class="scrolling menu" >
<div class="item selected" data-url="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c">master</div>
</div>
<div id="tag-list" class="scrolling menu" style="display: none">
</div>
</div>
</div>
</div>
<div class="fitted item">
<div class="ui breadcrumb">
<a class="section" href="/xdrm-brackets/proxy.ftp.c/src/master">proxy.ftp.c</a>
<div class="divider"> / </div>
<span class="section"><a href="/xdrm-brackets/proxy.ftp.c/src/master/dep">dep</a></span>
<div class="divider"> / </div>
<span class="active section">client.c</span>
</div>
</div>
<div class="right fitted item">
<div id="file-buttons" class="ui tiny blue buttons">
</div>
</div>
</div>
<div id="file-content" class="tab-size-8">
<h4 class="ui top attached header" id="repo-read-file">
<i class="file text outline icon ui left"></i>
<strong>client.c</strong> <span class="text grey normal">3.9KB</span>
<div class="ui right file-actions">
<div class="ui buttons">
<a class="ui button" href="/xdrm-brackets/proxy.ftp.c/src/18a5e4338baaec92912eee057d26004b57b0b2a0/dep/client.c">Permalink</a>
<a class="ui button" href="/xdrm-brackets/proxy.ftp.c/commits/master/dep/client.c">History</a>
<a class="ui button" href="/xdrm-brackets/proxy.ftp.c/raw/master/dep/client.c">Raw</a>
</div>
<i class="octicon octicon-pencil btn-octicon poping up disabled" data-content="You must fork this repository before editing the file" data-position="bottom center" data-variation="tiny inverted"></i>
<i class="octicon octicon-trashcan btn-octicon poping up disabled" data-content="You must have write access to make or propose changes to this file" data-position="bottom center" data-variation="tiny inverted"></i>
</div>
</h4>
<div class="ui attached table segment">
<div id="" class="file-view code-view has-emoji">
<table>
<tbody>
<tr>
<td class="lines-num"><span id="L1">1</span><span id="L2">2</span><span id="L3">3</span><span id="L4">4</span><span id="L5">5</span><span id="L6">6</span><span id="L7">7</span><span id="L8">8</span><span id="L9">9</span><span id="L10">10</span><span id="L11">11</span><span id="L12">12</span><span id="L13">13</span><span id="L14">14</span><span id="L15">15</span><span id="L16">16</span><span id="L17">17</span><span id="L18">18</span><span id="L19">19</span><span id="L20">20</span><span id="L21">21</span><span id="L22">22</span><span id="L23">23</span><span id="L24">24</span><span id="L25">25</span><span id="L26">26</span><span id="L27">27</span><span id="L28">28</span><span id="L29">29</span><span id="L30">30</span><span id="L31">31</span><span id="L32">32</span><span id="L33">33</span><span id="L34">34</span><span id="L35">35</span><span id="L36">36</span><span id="L37">37</span><span id="L38">38</span><span id="L39">39</span><span id="L40">40</span><span id="L41">41</span><span id="L42">42</span><span id="L43">43</span><span id="L44">44</span><span id="L45">45</span><span id="L46">46</span><span id="L47">47</span><span id="L48">48</span><span id="L49">49</span><span id="L50">50</span><span id="L51">51</span><span id="L52">52</span><span id="L53">53</span><span id="L54">54</span><span id="L55">55</span><span id="L56">56</span><span id="L57">57</span><span id="L58">58</span><span id="L59">59</span><span id="L60">60</span><span id="L61">61</span><span id="L62">62</span><span id="L63">63</span><span id="L64">64</span><span id="L65">65</span><span id="L66">66</span><span id="L67">67</span><span id="L68">68</span><span id="L69">69</span><span id="L70">70</span><span id="L71">71</span><span id="L72">72</span><span id="L73">73</span><span id="L74">74</span><span id="L75">75</span><span id="L76">76</span><span id="L77">77</span><span id="L78">78</span><span id="L79">79</span><span id="L80">80</span><span id="L81">81</span><span id="L82">82</span><span id="L83">83</span><span id="L84">84</span><span id="L85">85</span><span id="L86">86</span><span id="L87">87</span><span id="L88">88</span><span id="L89">89</span><span id="L90">90</span><span id="L91">91</span><span id="L92">92</span><span id="L93">93</span><span id="L94">94</span><span id="L95">95</span><span id="L96">96</span><span id="L97">97</span><span id="L98">98</span><span id="L99">99</span><span id="L100">100</span><span id="L101">101</span><span id="L102">102</span><span id="L103">103</span><span id="L104">104</span><span id="L105">105</span><span id="L106">106</span><span id="L107">107</span></td>
<td class="lines-code"><pre><code class="c"><ol class="linenums"><li class="L1" rel="L1">#include &#34;client.h&#34;</li>
<li class="L2" rel="L2"></li>
<li class="L3" rel="L3"></li>
<li class="L4" rel="L4">int CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){</li>
<li class="L5" rel="L5"> if( DEBUGMOD&amp;HDR ) printf(&#34;====== CONNECT_CLIENT(%s, %s, %d) ======\n\n&#34;, serverHost, serverPort, *pSocket);</li>
<li class="L6" rel="L6"></li>
<li class="L7" rel="L7"> struct addrinfo hints; // contiendra le filtre/format</li>
<li class="L8" rel="L8"> struct addrinfo* addrinfo; // contiendra les infos</li>
<li class="L9" rel="L9"> int CONNECT; // file_desc(s)</li>
<li class="L10" rel="L10"> int GETADDRINFO; // contiendra l&#39;erreur ou pas de getaddrinfo()</li>
<li class="L11" rel="L11"> char BUFFER[MAX_BUF_LEN]; // BUFFER de communication</li>
<li class="L12" rel="L12"></li>
<li class="L13" rel="L13"> /* [1] On définit le filtre/format</li>
<li class="L14" rel="L14"> =======================================================*/</li>
<li class="L15" rel="L15"> memset(&amp;hints, 0, sizeof(struct addrinfo)); // on vide le filtre</li>
<li class="L16" rel="L16"> hints.ai_family = AF_UNSPEC; // Allow IPv4 ou IPv6</li>
<li class="L17" rel="L17"> hints.ai_socktype = SOCK_STREAM; // TCP (SOCK_DGRAM = UDP)</li>
<li class="L18" rel="L18"> hints.ai_flags = 0; // non spécifié</li>
<li class="L19" rel="L19"> hints.ai_protocol = 0; // non spécifié</li>
<li class="L20" rel="L20"></li>
<li class="L21" rel="L21"> if( DEBUGMOD&amp;SCK ) printf(&#34;============HINTS===========\n&#34;);</li>
<li class="L22" rel="L22"> if( DEBUGMOD&amp;SCK ) printf( &#34;AI_FLAGS = %d\n&#34;, hints.ai_flags ); // int</li>
<li class="L23" rel="L23"> if( DEBUGMOD&amp;SCK ) printf( &#34;AI_FAMILY = %d\n&#34;, hints.ai_family ); // int</li>
<li class="L24" rel="L24"> if( DEBUGMOD&amp;SCK ) printf( &#34;AI_SOCKTYPE = %d\n&#34;, hints.ai_socktype ); // int</li>
<li class="L25" rel="L25"> if( DEBUGMOD&amp;SCK ) printf( &#34;AI_PROTOCOL = %d\n&#34;, hints.ai_protocol ); // int</li>
<li class="L26" rel="L26"> if( DEBUGMOD&amp;SCK ) printf( &#34;AI_ADDRLEN = %d\n&#34;, hints.ai_addrlen ); // int</li>
<li class="L27" rel="L27"> if( DEBUGMOD&amp;SCK ) printf(&#34;\n&#34;);</li>
<li class="L28" rel="L28"></li>
<li class="L29" rel="L29"></li>
<li class="L30" rel="L30"> /* [2] On récupère les infos</li>
<li class="L31" rel="L31"> =======================================================*/</li>
<li class="L32" rel="L32"> GETADDRINFO = getaddrinfo(serverHost, serverPort, &amp;hints, &amp;addrinfo);</li>
<li class="L33" rel="L33"></li>
<li class="L34" rel="L34"> // si erreur</li>
<li class="L35" rel="L35"> if( GETADDRINFO &lt; 0 ) return -1;</li>
<li class="L36" rel="L36"></li>
<li class="L37" rel="L37"> if( DEBUGMOD&amp;SCK ) printf(&#34;=============RES============\n&#34;);</li>
<li class="L38" rel="L38"> if( DEBUGMOD&amp;SCK ) printf( &#34;AI_FLAGS = %d\n&#34;, addrinfo-&gt;ai_flags ); // int</li>
<li class="L39" rel="L39"> if( DEBUGMOD&amp;SCK ) printf( &#34;AI_FAMILY = %d\n&#34;, addrinfo-&gt;ai_family ); // int</li>
<li class="L40" rel="L40"> if( DEBUGMOD&amp;SCK ) printf( &#34;AI_SOCKTYPE = %d\n&#34;, addrinfo-&gt;ai_socktype ); // int</li>
<li class="L41" rel="L41"> if( DEBUGMOD&amp;SCK ) printf( &#34;AI_PROTOCOL = %d\n&#34;, addrinfo-&gt;ai_protocol ); // int</li>
<li class="L42" rel="L42"> if( DEBUGMOD&amp;SCK ) printf( &#34;AI_ADDRLEN = %d\n&#34;, addrinfo-&gt;ai_addrlen ); // int</li>
<li class="L43" rel="L43"> if( DEBUGMOD&amp;SCK ) printf(&#34;\n&#34;);</li>
<li class="L44" rel="L44"></li>
<li class="L45" rel="L45"> /* [3] Création de la socket</li>
<li class="L46" rel="L46"> =======================================================*/</li>
<li class="L47" rel="L47"> *pSocket = socket(addrinfo-&gt;ai_family, addrinfo-&gt;ai_socktype, 0);</li>
<li class="L48" rel="L48"></li>
<li class="L49" rel="L49"> if( DEBUGMOD&amp;SCK ) printf(&#34;SOCKET = %d\n&#34;, *pSocket);</li>
<li class="L50" rel="L50"></li>
<li class="L51" rel="L51"> // si erreur</li>
<li class="L52" rel="L52"> if( *pSocket == -1 ) return -1;</li>
<li class="L53" rel="L53"></li>
<li class="L54" rel="L54"></li>
<li class="L55" rel="L55"> /* [4] On établit la connection</li>
<li class="L56" rel="L56"> =======================================================*/</li>
<li class="L57" rel="L57"> CONNECT = connect(</li>
<li class="L58" rel="L58"> *pSocket,</li>
<li class="L59" rel="L59"> addrinfo-&gt;ai_addr,</li>
<li class="L60" rel="L60"> addrinfo-&gt;ai_addrlen</li>
<li class="L61" rel="L61"> );</li>
<li class="L62" rel="L62"></li>
<li class="L63" rel="L63"> if( DEBUGMOD&amp;SCK ) printf(&#34;CONNECT = %d\n&#34;, CONNECT);</li>
<li class="L64" rel="L64"></li>
<li class="L65" rel="L65"> // si erreur</li>
<li class="L66" rel="L66"> if( CONNECT == -1 ) return -1;</li>
<li class="L67" rel="L67"></li>
<li class="L68" rel="L68"> // on a plus besoin des infos de l&#39;adresse</li>
<li class="L69" rel="L69"> freeaddrinfo(addrinfo);</li>
<li class="L70" rel="L70"></li>
<li class="L71" rel="L71"></li>
<li class="L72" rel="L72"> /* [5] On retourne la SOCKET</li>
<li class="L73" rel="L73"> =======================================================*/</li>
<li class="L74" rel="L74"> return *pSocket;</li>
<li class="L75" rel="L75">}</li>
<li class="L76" rel="L76"></li>
<li class="L77" rel="L77"></li>
<li class="L78" rel="L78"></li>
<li class="L79" rel="L79"></li>
<li class="L80" rel="L80"></li>
<li class="L81" rel="L81"></li>
<li class="L82" rel="L82">int CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer){</li>
<li class="L83" rel="L83"> if( DEBUGMOD&amp;HDR ) printf(&#34;====== CLIENT_SEND(%d, %s, %s) ======\n\n&#34;, *pSocket, pRequest, *pAnswer);</li>
<li class="L84" rel="L84"> char BUFFER[MAX_BUF_LEN] = {0};</li>
<li class="L85" rel="L85"></li>
<li class="L86" rel="L86"> /* [1] On écrit sur la socket</li>
<li class="L87" rel="L87"> =======================================================*/</li>
<li class="L88" rel="L88"> int nbSend = swrite(pSocket, pRequest);</li>
<li class="L89" rel="L89"></li>
<li class="L90" rel="L90"> if( DEBUGMOD&amp;BUF ) printf(&#34;nbSend: %d\n&#34;, nbSend);</li>
<li class="L91" rel="L91"> if( DEBUGMOD&amp;BUF ) printf(&#34;Message: %s\n&#34;, pRequest);</li>
<li class="L92" rel="L92"></li>
<li class="L93" rel="L93"> // si pas tout envoyé</li>
<li class="L94" rel="L94"> if( strlen(pRequest) != nbSend ) return -1;</li>
<li class="L95" rel="L95"></li>
<li class="L96" rel="L96"> /* [2] On attends et lit la réponse</li>
<li class="L97" rel="L97"> =======================================================*/</li>
<li class="L98" rel="L98"> int nbRecup = WAIT_SOCKET_UPDATE(pSocket, BUFFER);</li>
<li class="L99" rel="L99"></li>
<li class="L100" rel="L100"> /* [3] On retourne la réponse par référence</li>
<li class="L101" rel="L101"> =======================================================*/</li>
<li class="L102" rel="L102"> *pAnswer = malloc( MAX_BUF_LEN );</li>
<li class="L103" rel="L103"> strcpy(*pAnswer, BUFFER);</li>
<li class="L104" rel="L104"></li>
<li class="L105" rel="L105"> if( DEBUGMOD&amp;BUF ) printf(&#34;nbReceived: %d\n&#34;, nbRecup);</li>
<li class="L106" rel="L106"> if( DEBUGMOD&amp;BUF ) printf(&#34;Message: %s\n&#34;, *pAnswer);</li>
<li class="L107" rel="L107">}</li>
</ol></code></pre></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<script>
function submitDeleteForm() {
var message = prompt("delete_confirm_message\n\ndelete_commit_summary", "Delete ''");
if (message != null) {
$("#delete-message").val(message);
$("#delete-file-form").submit()
}
}
</script>
</div>
</div>
</div>
<footer>
<div class="ui container">
<div class="ui left">
© 2017 Gogs Version: 0.10.10.0308 Page: <strong>52ms</strong> Template: <strong>2ms</strong>
</div>
<div class="ui right links">
<div class="ui language bottom floating slide up dropdown link item">
<i class="world icon"></i>
<div class="text">English</div>
<div class="menu">
<a class="item active selected" href="#">English</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=zh-CN"></a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=zh-HK"></a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=zh-TW"></a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=de-DE">Deutsch</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=fr-FR">Français</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=nl-NL">Nederlands</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=lv-LV">Latviešu</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=ru-RU">Русский</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=ja-JP"></a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=es-ES">Español</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=pt-BR">Português do Brasil</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=pl-PL">Polski</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=bg-BG">български</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=it-IT">Italiano</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=fi-FI">Suomalainen</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=tr-TR">Türkçe</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.c?lang=cs-CZ">čeština</a>
</div>
</div>
<a href="/assets/librejs/librejs.html" style="display:none" data-jslicense="1">Javascript Licenses</a>
<a target="_blank" href="https://gogs.io">Website</a>
<span class="version">Go1.8</span>
</div>
</div>
</footer>
</body>
<link rel="stylesheet" href="/plugins/highlight-9.6.0/github.css">
<script src="/plugins/highlight-9.6.0/highlight.pack.js"></script>
<script src="/js/libs/emojify-1.1.0.min.js"></script>
<script src="/js/libs/clipboard-1.5.9.min.js"></script>
</html>

View File

@ -1,433 +0,0 @@
<!DOCTYPE html>
<html>
<head data-suburl="">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="author" content="xdrm-brackets" />
<meta name="description" content="proxy.ftp.c" />
<meta name="keywords" content="go, git, self-hosted, gogs">
<meta name="referrer" content="no-referrer" />
<meta name="_csrf" content="sS0pasZdHndRhsO38JoAUyyuIWs6MTQ5MDcxOTc2NzE3OTU4NzUxOA==" />
<meta name="_suburl" content="" />
<meta property="og:url" content="https://git.xdrm.io/xdrm-brackets/proxy.ftp.c" />
<meta property="og:type" content="object" />
<meta property="og:title" content="xdrm-brackets/proxy.ftp.c">
<meta property="og:description" content="">
<link rel="shortcut icon" href="/img/favicon.png" />
<script src="/js/jquery-1.11.3.min.js"></script>
<script src="/js/libs/jquery.are-you-sure.js"></script>
<link rel="stylesheet" href="/assets/font-awesome-4.6.3/css/font-awesome.min.css">
<link rel="stylesheet" href="/assets/octicons-4.3.0/octicons.min.css">
<link rel="stylesheet" href="/css/semantic-2.2.7.min.css">
<link rel="stylesheet" href="/css/gogs.css?v=73519fd9811805bce6fc4aa2d24bb413">
<script src="/js/semantic-2.2.7.min.js"></script>
<script src="/js/gogs.js?v=73519fd9811805bce6fc4aa2d24bb413"></script>
<title>xdrm-brackets/proxy.ftp.c - xdrm-brackets&#39; git server</title>
<meta name="theme-color" content="#ff5343">
</head>
<body>
<div class="full height">
<noscript>Please enable JavaScript in your browser!</noscript>
<div class="following bar light">
<div class="ui container">
<div class="ui grid">
<div class="column">
<div class="ui top secondary menu">
<a class="item brand" href="/">
<img class="ui mini image" src="/img/favicon.png">
</a>
<a class="item" href="/">Home</a>
<a class="item" href="/explore/repos">Explore</a>
<a class="item" target="_blank" href="https://gogs.io/docs" rel="noreferrer">Help</a>
<div class="right menu">
<a class="item" href="/user/sign_up">
<i class="octicon octicon-person"></i> Register
</a>
<a class="item" href="/user/login?redirect_to=%2fxdrm-brackets%2fproxy.ftp.c%2fsrc%2fmaster%2fdep%2fclient.h">
<i class="octicon octicon-sign-in"></i> Sign In
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="repository file list">
<div class="header-wrapper">
<div class="ui container">
<div class="ui vertically padded grid head">
<div class="column">
<div class="ui header">
<div class="ui huge breadcrumb">
<i class="mega-octicon octicon-repo"></i>
<a href="/xdrm-brackets">xdrm-brackets</a>
<div class="divider"> / </div>
<a href="/xdrm-brackets/proxy.ftp.c">proxy.ftp.c</a>
</div>
<div class="ui right">
<div class="ui labeled button" tabindex="0">
<a class="ui button" href="/xdrm-brackets/proxy.ftp.c/action/watch?redirect_to=%2fxdrm-brackets%2fproxy.ftp.c%2fsrc%2fmaster%2fdep%2fclient.h">
<i class="icon fa-eye-slash"></i>Watch
</a>
<a class="ui basic label" href="/xdrm-brackets/proxy.ftp.c/watchers">
1
</a>
</div>
<div class="ui labeled button" tabindex="0">
<a class="ui button" href="/xdrm-brackets/proxy.ftp.c/action/star?redirect_to=%2fxdrm-brackets%2fproxy.ftp.c%2fsrc%2fmaster%2fdep%2fclient.h">
<i class="icon fa-star-o"></i>Star
</a>
<a class="ui basic label" href="/xdrm-brackets/proxy.ftp.c/stars">
0
</a>
</div>
<div class="ui labeled button" tabindex="0">
<a class="ui button " href="/repo/fork/49">
<i class="octicon octicon-repo-forked"></i>Fork
</a>
<a class="ui basic label" href="/xdrm-brackets/proxy.ftp.c/forks">
0
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="ui tabs container">
<div class="ui tabular menu navbar">
<a class="active item" href="/xdrm-brackets/proxy.ftp.c">
<i class="octicon octicon-file-text"></i> Files
</a>
<a class=" item" href="/xdrm-brackets/proxy.ftp.c/issues">
<i class="octicon octicon-issue-opened"></i> Issues <span class="ui gray small label">0</span>
</a>
<a class=" item" href="/xdrm-brackets/proxy.ftp.c/pulls">
<i class="octicon octicon-git-pull-request"></i> Pull Requests <span class="ui gray small label">0</span>
</a>
<a class=" item" href="/xdrm-brackets/proxy.ftp.c/commits/master">
<i class="octicon octicon-history"></i> Commits <span class="ui blue small label">23</span>
</a>
<a class=" item" href="/xdrm-brackets/proxy.ftp.c/releases">
<i class="octicon octicon-tag"></i> Releases <span class="ui gray small label">0</span>
</a>
<a class=" item" href="/xdrm-brackets/proxy.ftp.c/wiki">
<i class="octicon octicon-book"></i> Wiki
</a>
</div>
</div>
<div class="ui tabs divider"></div>
</div>
<div class="ui container">
<p id="repo-desc">
<span class="no-description text-italic">No Description</span>
<a class="link" href=""></a>
</p>
<div class="ui secondary menu">
<div class="fitted item choose reference">
<div class="ui floating filter dropdown" data-no-results="No results found.">
<div class="ui basic small button">
<span class="text">
<i class="octicon octicon-git-branch"></i>
Branch:
<strong>master</strong>
</span>
<i class="dropdown icon"></i>
</div>
<div class="menu">
<div class="ui icon search input">
<i class="filter icon"></i>
<input name="search" placeholder="Filter branch or tag...">
</div>
<div class="header">
<div class="ui grid">
<div class="two column row">
<a class="reference column" href="#" data-target="#branch-list">
<span class="text black">
<i class="octicon octicon-git-branch"></i> Branches
</span>
</a>
<a class="reference column" href="#" data-target="#tag-list">
<span class="text ">
<i class="reference tags icon"></i> Tags
</span>
</a>
</div>
</div>
</div>
<div id="branch-list" class="scrolling menu" >
<div class="item selected" data-url="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h">master</div>
</div>
<div id="tag-list" class="scrolling menu" style="display: none">
</div>
</div>
</div>
</div>
<div class="fitted item">
<div class="ui breadcrumb">
<a class="section" href="/xdrm-brackets/proxy.ftp.c/src/master">proxy.ftp.c</a>
<div class="divider"> / </div>
<span class="section"><a href="/xdrm-brackets/proxy.ftp.c/src/master/dep">dep</a></span>
<div class="divider"> / </div>
<span class="active section">client.h</span>
</div>
</div>
<div class="right fitted item">
<div id="file-buttons" class="ui tiny blue buttons">
</div>
</div>
</div>
<div id="file-content" class="tab-size-8">
<h4 class="ui top attached header" id="repo-read-file">
<i class="file text outline icon ui left"></i>
<strong>client.h</strong> <span class="text grey normal">1.0KB</span>
<div class="ui right file-actions">
<div class="ui buttons">
<a class="ui button" href="/xdrm-brackets/proxy.ftp.c/src/18a5e4338baaec92912eee057d26004b57b0b2a0/dep/client.h">Permalink</a>
<a class="ui button" href="/xdrm-brackets/proxy.ftp.c/commits/master/dep/client.h">History</a>
<a class="ui button" href="/xdrm-brackets/proxy.ftp.c/raw/master/dep/client.h">Raw</a>
</div>
<i class="octicon octicon-pencil btn-octicon poping up disabled" data-content="You must fork this repository before editing the file" data-position="bottom center" data-variation="tiny inverted"></i>
<i class="octicon octicon-trashcan btn-octicon poping up disabled" data-content="You must have write access to make or propose changes to this file" data-position="bottom center" data-variation="tiny inverted"></i>
</div>
</h4>
<div class="ui attached table segment">
<div id="" class="file-view code-view has-emoji">
<table>
<tbody>
<tr>
<td class="lines-num"><span id="L1">1</span><span id="L2">2</span><span id="L3">3</span><span id="L4">4</span><span id="L5">5</span><span id="L6">6</span><span id="L7">7</span><span id="L8">8</span><span id="L9">9</span><span id="L10">10</span><span id="L11">11</span><span id="L12">12</span><span id="L13">13</span><span id="L14">14</span><span id="L15">15</span><span id="L16">16</span><span id="L17">17</span><span id="L18">18</span><span id="L19">19</span><span id="L20">20</span><span id="L21">21</span><span id="L22">22</span><span id="L23">23</span><span id="L24">24</span><span id="L25">25</span><span id="L26">26</span><span id="L27">27</span><span id="L28">28</span><span id="L29">29</span><span id="L30">30</span><span id="L31">31</span><span id="L32">32</span><span id="L33">33</span><span id="L34">34</span><span id="L35">35</span><span id="L36">36</span><span id="L37">37</span><span id="L38">38</span><span id="L39">39</span><span id="L40">40</span></td>
<td class="lines-code"><pre><code class=""><ol class="linenums"><li class="L1" rel="L1">/* Envoi d&#39;une requête à un serveur et réception de la réponse</li>
<li class="L2" rel="L2">*</li>
<li class="L3" rel="L3">* @serverHost&lt;char*&gt; Nom de l&#39;hôte distant (server)</li>
<li class="L4" rel="L4">* @serverPort&lt;char*&gt; Numéro du port distant (server)</li>
<li class="L5" rel="L5">* @pSocket&lt;int*&gt; Pointeur sur la requête à créer</li>
<li class="L6" rel="L6">*</li>
<li class="L7" rel="L7">*</li>
<li class="L8" rel="L8">* @return error&lt;int&gt; retourne -1 en cas d&#39;erreur, sinon la SOCKET</li>
<li class="L9" rel="L9">*</li>
<li class="L10" rel="L10">*</li>
<li class="L11" rel="L11">* </li>
<li class="L12" rel="L12">* @history</li>
<li class="L13" rel="L13">* [1] On définit le filtre/format</li>
<li class="L14" rel="L14">* [2] On récupère les infos</li>
<li class="L15" rel="L15">* [3] Création de la socket</li>
<li class="L16" rel="L16">* [4] On établit la connection</li>
<li class="L17" rel="L17">* [5] On retourne la SOCKET</li>
<li class="L18" rel="L18">* </li>
<li class="L19" rel="L19">*/</li>
<li class="L20" rel="L20">int CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket);</li>
<li class="L21" rel="L21"></li>
<li class="L22" rel="L22"></li>
<li class="L23" rel="L23"></li>
<li class="L24" rel="L24">/* Envoi d&#39;une requête vers une SOCKET et récupère la réponse</li>
<li class="L25" rel="L25">*</li>
<li class="L26" rel="L26">* @pSocket&lt;int*&gt; Pointeur sur la SOCKET en question</li>
<li class="L27" rel="L27">* @pRequest&lt;char*&gt; Requête à lui envoyer (swrite)</li>
<li class="L28" rel="L28">* @pAnswer&lt;char**&gt; Réponse qui se lira après la requête (sread)</li>
<li class="L29" rel="L29">*</li>
<li class="L30" rel="L30">* @return error&lt;int&gt; Retourne -1 en cas d&#39;erreur</li>
<li class="L31" rel="L31">*</li>
<li class="L32" rel="L32">*</li>
<li class="L33" rel="L33">*</li>
<li class="L34" rel="L34">* @history</li>
<li class="L35" rel="L35">* [1] On écrit sur la socket</li>
<li class="L36" rel="L36">* [2] On attends et lit la réponse</li>
<li class="L37" rel="L37">* [3] On retourne la réponse par référence</li>
<li class="L38" rel="L38">* </li>
<li class="L39" rel="L39">*/</li>
<li class="L40" rel="L40">int CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer);</li>
</ol></code></pre></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<script>
function submitDeleteForm() {
var message = prompt("delete_confirm_message\n\ndelete_commit_summary", "Delete ''");
if (message != null) {
$("#delete-message").val(message);
$("#delete-file-form").submit()
}
}
</script>
</div>
</div>
</div>
<footer>
<div class="ui container">
<div class="ui left">
© 2017 Gogs Version: 0.10.10.0308 Page: <strong>53ms</strong> Template: <strong>1ms</strong>
</div>
<div class="ui right links">
<div class="ui language bottom floating slide up dropdown link item">
<i class="world icon"></i>
<div class="text">English</div>
<div class="menu">
<a class="item active selected" href="#">English</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h?lang=zh-CN"></a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h?lang=zh-HK"></a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h?lang=zh-TW"></a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h?lang=de-DE">Deutsch</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h?lang=fr-FR">Français</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h?lang=nl-NL">Nederlands</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h?lang=lv-LV">Latviešu</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h?lang=ru-RU">Русский</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h?lang=ja-JP"></a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h?lang=es-ES">Español</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h?lang=pt-BR">Português do Brasil</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h?lang=pl-PL">Polski</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h?lang=bg-BG">български</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h?lang=it-IT">Italiano</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h?lang=fi-FI">Suomalainen</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h?lang=tr-TR">Türkçe</a>
<a class="item " href="/xdrm-brackets/proxy.ftp.c/src/master/dep/client.h?lang=cs-CZ">čeština</a>
</div>
</div>
<a href="/assets/librejs/librejs.html" style="display:none" data-jslicense="1">Javascript Licenses</a>
<a target="_blank" href="https://gogs.io">Website</a>
<span class="version">Go1.8</span>
</div>
</div>
</footer>
</body>
<link rel="stylesheet" href="/plugins/highlight-9.6.0/github.css">
<script src="/plugins/highlight-9.6.0/highlight.pack.js"></script>
<script src="/js/libs/emojify-1.1.0.min.js"></script>
<script src="/js/libs/clipboard-1.5.9.min.js"></script>
</html>

View File

@ -1,169 +0,0 @@
#include "utility.h"
void splitFtpRequest(char* pRequest, char* pCommand, char* pContent){
/* [1] Vérification du format
===========================================*/
int firstSpaceIndex = indexOf(pRequest, ' ');
if( firstSpaceIndex != 3 && firstSpaceIndex != 4){ // contient aucun espace en position 3 ou 4, on quitte
strcpy(pCommand, "ERROR");
strcpy(pContent, "");
return;
}
/* [2] Séparation des 2 parties
===========================================*/
int i;
for( i = 0 ; i < strlen(pRequest) && pRequest[i] != '\0' ; i++ ){
if( i < firstSpaceIndex ) // première partie (pCommand)
strcat( pCommand, (char[2]){(char) pRequest[i], '\0'});
if( i > firstSpaceIndex ) // seconde partie (pContent)
strcat( pContent, (char[2]){(char) pRequest[i], '\0'});
}
}
void splitFtpResponse(char* pAnswer, char* ftpCode, char* ftpText){
/* [1] Vérification du format
===========================================*/
int codeLength = 3; // taille du code
/* [2] Séparation des 2 parties
===========================================*/
int i;
for( i = 0 ; i < strlen(pAnswer) && pAnswer[i] != '\0' ; i++ ){
if( i < codeLength ) // première partie (ftpCode)
strcat(ftpCode, (char[2]){(char)pAnswer[i], '\0' });
if( i > codeLength ) // seconde partie (ftpText)
strcat(ftpText, (char[2]){(char)pAnswer[i], '\0' });
}
}
int indexOf(char* haystack, char needle){
int i;
for( i = 0 ; i < strlen(haystack) && haystack[i] != '\0' ; i++ )
if( haystack[i] == needle ) // si on trouve le caractère
return i;
return -1;
}
int swrite(int* pSocket, char* pBuffer){
if( *pSocket == -1 ) return -1; // si SOCKET fermée, on retourne une erreur
if( strlen(pBuffer) == 0 ) return 0; // si on a rien à écrire, on n'écrit rien :p
/* 1. On écrit sur la SOCKET */
if( DEBUGMOD&BUF ) printf("SENDLEN_1: %lu\n", strlen(pBuffer));
int nbSent = write(*pSocket, pBuffer, strlen(pBuffer));
if( DEBUGMOD&BUF ) printf("SENDLEN_2: %d\n", nbSent);
/* 2. Si on est déconnecté, on retourne une erreur */
if( nbSent <= 0 ){
if( DEBUGMOD&BUF ) printf("NOTHING TO SEND\n");
return -1; // on retourne une erreur
}
if( DEBUGMOD&RVL ) printf("SEND_1\n");
if( DEBUGMOD&RVL ) revealString(pBuffer);
if( DEBUGMOD&RVL ) printf("SEND_2\n");
/* 3. On retourne le nombre de <char> envoyés */
return nbSent;
}
int sread(int* pSocket, char* pBuffer){
if( *pSocket == -1 ) return -1; // si SOCKET fermée, on retourne une erreur
/* 1. On vide le buffer avant de lire */
memset(pBuffer, '\0', MAX_BUF_LEN);
if( DEBUGMOD&BUF ) printf("READLEN_1: %lu\n", strlen(pBuffer));
/* 2. On lit la SOCKET */
int nbRead = read(*pSocket, pBuffer, MAX_BUF_LEN);
if( DEBUGMOD&BUF ) printf("READLEN_3: %d\n", nbRead);
/* 3. Si on est déconnecté, on retourne une erreur */
if( nbRead <= 0 ){
if( DEBUGMOD&BUF ) printf("NOTHING TO READ\n");
return -1; // on retourne une erreur
}
if( DEBUGMOD&RVL ) printf("READ_1\n");
if( DEBUGMOD&RVL ) revealString(pBuffer);
if( DEBUGMOD&RVL ) printf("READ_2\n");
/* 4. On retourne le nombre de caractères lus */
return nbRead;
}
void setSocketTimeout(int* pSocket, const int pSec, const int pUSec){
/* 1. On créé la structure contenant le timeout */
struct timeval timeout;
timeout.tv_sec = pSec;
timeout.tv_usec = pUSec;
setsockopt(*pSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(struct timeval));
if( DEBUGMOD&SCK ) printf("Set socket(%d) timeout to %lus\n", *pSocket, (long unsigned) timeout.tv_sec );
}
void xPrint(char* pPattern, char* pBuffer){
char tmpBuffer[MAX_BUF_LEN];
strcpy(tmpBuffer, pBuffer);
int i;
// on supprimes les retours à la ligne de la fin
for( i = strlen(tmpBuffer)-1 ; i >= 0 && tmpBuffer[i] != '\0' ; i-- )
if( tmpBuffer[i] == '\n' || tmpBuffer[i] == '\r' ) // si c'est un retour chariot
tmpBuffer[i] = '\0'; // on efface
else
break;
printf(pPattern, pBuffer);
}
void revealString(char* pString){
/* 1. On créé une copie de @pString */
char revealedString[MAX_BUF_LEN] = {0};
/* 2. On rend visible tous les caractères "invisibles" */
int i;
for( i = 0 ; i < strlen(pString) && pString[i] != '\0' ; i++ ){
if( pString[i] == '\r' ){ revealedString[strlen(revealedString)] = '\\'; revealedString[strlen(revealedString)] = 'r'; }
else if( pString[i] == '\n' ){ revealedString[strlen(revealedString)] = '\\'; revealedString[strlen(revealedString)] = 'n'; }
else revealedString[strlen(revealedString)] = pString[i];
revealedString[strlen(revealedString)] = '\0';
}
/* 3. On affiche la chaîne explicite */
if( DEBUGMOD&RVL ) printf("[[%s]]\n", revealedString);
}

View File

@ -1,60 +0,0 @@
/* Découpe la requête FTP en 2 parties
*
* @pRequest<char*> La requête en question
*
* @pCommand<char*> Remplissage: commande (1ère partie)
* @pContant<char*> Remplissage: contenu (2ème partie)
*
*
*/
void splitFtpRequest(char* pRequest, char* pCommand, char* pContent);
/* Découpe la réponse FTP en 2 parties
*
* @pAnswer<char*> La réponse en question
*
* @ftpCode<char*> Remplissage: code FTP (1ère partie)
* @ftpText<char*> Remplissage: text associé (2ème partie)
*
*
*/
void splitFtpResponse(char* pAnswer, char* ftpCode, char* ftpText);
/* Retourne le rang d'un caractère dans une string
*
* @haystack<char*> La chaîne dans laquelle rechercher
* @needle<char> Le caractère recherché
*
* @return position<int> Retourne l'index de @needle dans @haystack ou -1 si ne trouve pas
*
*/
int indexOf(char* haystack, char needle);
void setSocketTimeout(int* pSocket, const int pSec, const int pUSec);
/* read/write socket */
int swrite(int* pSocket, char* pBuffer);
int sread(int* pSocket, char* pBuffer);
/* Affiche une string en supprimant les retours à la ligne de fin de chaînes
*
* @pPattern<char*> Schéma du print (1er arg)
* @pBuffer<char*> Buffer en question
*
*/
void xPrint(char* pPattern, char* pBuffer);
/* Révèle les caractères spéciaux d'une string
*
* @pString<char*> La string à révéler
*
*
* @print explicitString<char*> On affiche la chaîne explicité
*
*/
void revealString(char* pString);

31
plane/lib/header.h Normal file
View File

@ -0,0 +1,31 @@
#ifndef _LIB_HEADER_H_
#define _LIB_HEADER_H_
/* global */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <time.h>
#include <math.h>
/* sys */
#include <sys/types.h>
#include <sys/socket.h>
/* socket */
#include <unistd.h> // close
#include <netinet/in.h>
#include <netdb.h> // getaddrinfo, getnameinfo
#include <arpa/inet.h>
/* vars */
#define SRV_HOST "localhost"
#define SRV_PORT 4444
#define MAX_BUF_LEN 512
#endif

View File

@ -0,0 +1,64 @@
#include "serializer.h"
int parse_plane_request(const char* pIn, struct plane_request* pOut){
/* 1. Check buffer length */
if( strlen(pIn)*sizeof(char) != sizeof(struct plane_request) )
return -1;
/* 2. Parse buffer */
memcpy(pOut, pIn, (size_t) sizeof(struct plane_request));
return 0;
}
int parse_viewterm_request(const char* pIn, struct vterm_request* pOut){
/* 1. Check buffer length */
if( strlen(pIn)*sizeof(char) != sizeof(struct vterm_request) )
return -1;
/* 2. Parse buffer */
memcpy(pOut, pIn, sizeof(struct vterm_request));
return 0;
}
int parse_ctrlterm_request(const char* pIn, struct cterm_request* pOut){
/* 1. Check buffer length */
if( strlen(pIn)*sizeof(char) != sizeof(struct cterm_request) )
return -1;
/* 2. Parse buffer */
memcpy(pOut, pIn, sizeof(struct cterm_request));
return 0;
}
int serialize_term_response(const struct term_response* pIn, char* pOut, const size_t pSize){
/* 1. Check buffer length */
if( sizeof(struct term_response) > pSize*sizeof(char) )
return -1;
/* 2. Serialize response into buffer */
memcpy(pOut, pIn, sizeof(struct term_response));
return 0;
}

View File

@ -0,0 +1,65 @@
#ifndef _LIB_NETWORK_FORMAT_SERIALIZER_H_
#define _LIB_NETWORK_FORMAT_SERIALIZER_H_
#include <string.h>
#include "../../../plane.h"
struct plane_request{ // Plane Request
struct coord co;
struct control ct;
};
struct vterm_request{ // ViewTerminal Request
char flags;
};
struct term_response{ // Terminal-s Response
char flags;
struct coord co;
struct control ct;
};
struct cterm_request{ // ControlTerminal Request
char flags;
int z;
struct control ct;
};
/* Parse a plane request ('char*' to 'struct plane_request')
*
* @history
* [1] Check if buffer have correct size (according to destination struct)
* [2] Parse buffer to struct
*
*/
int parse_plane_request(const char* pIn, struct plane_request* pOut);
/* Parse a viewTerminal request ('char*' to 'struct vt_request')
*
* @history
* [1] Check if buffer have correct size (according to destination struct)
* [2] Parse buffer to struct
*
*/
int parse_viewterm_request(const char* pIn, struct vterm_request* pOut);
/* Parse a ctrlTerminal request ('char*' to 'struct ct_request')
*
* @history
* [1] Check if buffer have correct size (according to destination struct)
* [2] Parse buffer to struct
*
*/
int parse_ctrlterm_request(const char* pIn, struct cterm_request* pOut);
/* Serialize a Terminal response ('struct t_response' to 'char*')
*
* @history
* [1] Check if buffer have correct size (according to input struct)
* [2] Serialize struct into buffer
*
*/
int serialize_term_response(const struct term_response* pIn, char* pOut, const size_t pSize);
#endif

View File

@ -0,0 +1 @@
#include "client.h"

View File

@ -0,0 +1,7 @@
#ifndef _LIB_NETWORK_TCP_CLIENT_H_
#define _LIB_NETWORK_TCP_CLIENT_H_
#endif

View File

@ -0,0 +1,171 @@
#include "plane.h"
// numéro de vol de l'plane : code sur 5 caractères
char numero_vol[6];
struct coord crd;
struct control ctrl;
int clientsock = -1;
char buffer[MAX_BUF_LEN] = {0};
/********************************
*** 3 fonctions à implémenter
********************************/
int open_communication(){
// fonction à implémenter qui permet d'entrer en communication via TCP
// avec le gestionnaire de vols
/* 0. Initialisation des variables */
// struct hostent* host = NULL;
struct sockaddr_in server;
/* 1. Création de la socket */
clientsock = socket(AF_INET, SOCK_STREAM, 0);
/* 1bis. Gestion erreur socket */
if( clientsock < 0 )
return 0;
/* 2. Hostname Lookup */
// host = gethostbyname(SRV_HOST);
// /* 2bis. Gestion erreur */
// if( host == NULL )
// return 0;
/* 3. Mise à jour des infos serveur */
bzero(&server, sizeof(struct sockaddr_in));
server.sin_family = AF_INET;
server.sin_port = htons(SRV_PORT);
server.sin_addr.s_addr = inet_addr(SRV_HOST);
// // On récupère l'adresse serveur du lookup
// memcpy(&server->sin_addr.s_addr, *(host->h_addr_list), host->h_length);
/* 4. Connection */
if( connect(clientsock, (struct sockaddr*) &server, sizeof(struct sockaddr_in)) < 0 )
return 0;
return 1;
}
void fermer_communication(){
// fonction à implémenter qui permet de fermer la communication
// avec le gestionnaire de vols
}
void envoyer_caracteristiques(){
// fonction à implémenter qui envoie l'ensemble des caractéristiques
// courantes de l'plane au gestionnaire de vols
}
/********************************
*** Fonctions gérant le déplacement de l'plane : ne pas modifier
********************************/
// initialise aléatoirement les paramètres initiaux de l'plane
void init_plane(){
// initialisation aléatoire du compteur aléatoire
unsigned int seed;
time( (time_t*) &seed);
srandom(seed);
// intialisation des paramètres de l'plane
crd.x = 1000 + random() % 1000;
crd.y = 1000 + random() % 1000;
crd.z = 900 + random() % 100;
ctrl.cap = random() % 360;
ctrl.speed = 600 + random() % 200;
// initialisation du numero de l'plane : chaine de 5 caractères
// formée de 2 lettres puis 3 chiffres
numero_vol[0] = (random() % 26) + 'A';
numero_vol[1] = (random() % 26) + 'A';
numero_vol[5] = 0;
}
// modifie la valeur de l'plane avec la valeur passée en paramètre
void update_speed(int speed){
if (speed < 0) ctrl.speed = speed;
}
// modifie le cap de l'plane avec la valeur passée en paramètre
void update_cap(int cap){
if ((cap >= 0) && (cap < 360))
ctrl.cap = cap;
}
// modifie l'z de l'plane avec la valeur passée en paramètre
void update_z(int alt){
if (alt < 0)
crd.z = alt;
}
// affiche les caractéristiques courantes de l'plane
void display_data(){
printf("Avion %6s -> localisation : (%d,%d), altitude : %d, vitesse : %d, cap : %d\n",
numero_vol, crd.x, crd.y, crd.z, ctrl.speed, ctrl.cap);
}
// recalcule la localisation de l'plane en fonction de sa speed et de son cap
void calc_ctrl(){
float ctrl_x, ctrl_y;
if (ctrl.speed < VITMIN){
fermer_communication();
exit(2);
}
if (crd.z == 0){
fermer_communication();
exit(3);
}
ctrl_x = cos(ctrl.cap * 2 * M_PI / 360) * ctrl.speed * 10 / VITMIN;
ctrl_y = sin(ctrl.cap * 2 * M_PI / 360) * ctrl.speed * 10 / VITMIN;
// on se déplace d'au moins une case quels que soient le cap et la speed
// sauf si cap est un des angles droit
if ((ctrl_x > 0) && (ctrl_x < 1)) ctrl_x = 1;
if ((ctrl_x < 0) && (ctrl_x > -1)) ctrl_x = -1;
if ((ctrl_y > 0) && (ctrl_y < 1)) ctrl_y = 1;
if ((ctrl_y < 0) && (ctrl_y > -1)) ctrl_y = -1;
crd.x = crd.x + (int)ctrl_x;
crd.y = crd.y + (int)ctrl_y;
display_data();
}
// fonction principale : gère l'exécution de l'plane au fil du temps
void update(){
while( 1 ){
sleep(PAUSE);
calc_ctrl();
envoyer_caracteristiques();
}
}
int main(){
// on initialise le plane
init_plane();
display_data();
// on quitte si on arrive à pas contacter le gestionnaire de vols
if( !open_communication() ){
exit(1);
}
// on se déplace une fois toutes les initialisations faites
update();
}

View File

@ -0,0 +1,27 @@
#ifndef _PLANE_H_
#define _PLANE_H_
#include "lib/header.h"
#define ALTMAX 20000
#define ALTMIN 0
#define VITMAX 1000
#define VITMIN 200
#define PAUSE 2
struct coord {
int x;
int y;
int z;
};
struct control {
int cap;
int speed;
};
#endif