Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions deno.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

41 changes: 41 additions & 0 deletions examples/c/network/.napirc
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"language": "c",
"project": {
"include": [
"**/*.c",
"**/*.h"
],
"exclude": [
".git/**",
"**/dist/**",
"**/build/**",
"**/bin/**",
"**/obj/**",
"**/packages/**",
"**/.vs/**",
"**/TestResults/**",
"**/*.user",
"**/*.suo",
"**/.nuget/**",
"**/artifacts/**",
"**/packages/**",
"**/util/**",
"**/test/**",
"**/perf/**",
"**/napi_out/**"
]
},
"outDir": "napi_out",
"metrics": {
"file": {
"maxChar": 100000,
"maxLine": 1000,
"maxDep": 10
},
"symbol": {
"maxChar": 50000,
"maxLine": 500,
"maxDep": 5
}
}
}
66 changes: 66 additions & 0 deletions examples/c/network/makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# --- Macros ---

# compilation
exec = gcc -Wall -Wextra -pedantic -O3 -g3 -fopenmp -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls
comp = gcc -c -Wall -Wextra -pedantic -O3 -g3 -fopenmp -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls
toexe = -o
toobj = -o

# sources
SRCSC= $(wildcard src/*/*.c)
SRCSH= $(wildcard src/*/*.h)

TSTSC= $(wildcard tst/*.c)

# objects
OBJS= $(wildcard obj/*.o)
OBJBM= $(wildcard src/*/*.o)


# --- Functions ---

all: test main

main: create_exe_main to_obj_src

test: bin_mkdir create_exe_new to_obj

clean: clean_o clean_bin

bin_mkdir:
mkdir -p bin;

obj_mkdir:
mkdir -p obj;

tst_mov:
mv $(foreach exe, $(TSTSC:tst/%.c=%) , $(exe) ) bin


create_exe_new: create_obj
$(foreach test_obj,$(TSTSC:%.c=%.o), $(exec) $(test_obj) $(SRCSC:%.c=%.o) $(toexe) $(test_obj:%.o=%);)

create_exe_main: create_obj_main
$(exec) obj/main.o $(SRCSC:%.c=%.o) $(toexe) app

to_obj: obj_mkdir to_obj_src to_obj_tst



to_obj_src:
mv $(foreach obj,$(SRCSC:%.c=%.o), $(obj) ) obj

to_obj_tst:
mv $(foreach obj,$(TSTSC:%.c=%.o), $(obj) ) obj


create_obj: create_obj_src create_obj_tst

create_obj_src:
$(foreach cfl, $(SRCSC), $(comp) $(cfl) $(toobj) $(cfl:%.c=%).o;)

create_obj_tst:
$(foreach cfl, $(TSTSC), $(comp) $(cfl) $(toobj) $(cfl:%.c=%).o;)

create_obj_main: obj_mkdir create_obj_src
$(comp) src/main.c $(toobj) obj/main.o
96 changes: 96 additions & 0 deletions examples/c/network/src/cartographie/cartographie.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
#include "cartographie.h"

void scanHorizontal(const char* network) {
struct sockaddr_in addr;
int sockfd, ttl = 64, timeout = 1000;
char ip[INET_ADDRSTRLEN];

// Création du socket
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (sockfd < 0) {
perror("socket");
exit(EXIT_FAILURE);
}

// Définition de l'option TTL
if (setsockopt(sockfd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)) < 0) {
perror("setsockopt");
exit(EXIT_FAILURE);
}

// Définition de l'option de timeout
struct timeval tv;
tv.tv_sec = timeout / 1000;
tv.tv_usec = (timeout % 1000) * 1000;
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) {
perror("setsockopt");
exit(EXIT_FAILURE);
}

// Scan du réseau
for (int i = 1; i <= 255; i++) {
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;

// Adresse --> octets
int octet1, octet2, octet3, octet4;
sscanf(network, "%d.%d.%d.%d", &octet1, &octet2, &octet3, &octet4);

// Dernier octet --> i
octet4 = i;

// Réassemblement de l'adresse
char host[INET_ADDRSTRLEN];
sprintf(host, "%d.%d.%d.%d", octet1, octet2, octet3, octet4);

// Conversion adresse en binaire
inet_pton(AF_INET, host, &(addr.sin_addr));

// Conversion adresse en texte
inet_ntop(AF_INET, &(addr.sin_addr), ip, INET_ADDRSTRLEN);

// Envoi du paquet ICMP
struct icmphdr icmp;
memset(&icmp, 0, sizeof(icmp));
icmp.type = ICMP_ECHO;
icmp.code = 0;
icmp.checksum = htons(~(ICMP_ECHO << 8));

if (sendto(sockfd, &icmp, sizeof(icmp), 0, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
perror("sendto");
continue;
}

// Attente de la réponse
fd_set read_set;
FD_ZERO(&read_set);
FD_SET(sockfd, &read_set);
struct timeval timeout;
timeout.tv_sec = 1;
timeout.tv_usec = 0;
int select_result = select(sockfd + 1, &read_set, NULL, NULL, &timeout);
if (select_result < 0) {
perror("select");
continue;
} else if (select_result == 0) {
printf("Aucune réponse de %s\n", ip);
continue;
}

// Réception de la réponse
char buffer[IP_MAXPACKET];
struct sockaddr_in sender;
socklen_t sender_len = sizeof(sender);
ssize_t packet_len = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&sender, &sender_len);
if (packet_len < 0) {
perror("recvfrom");
continue;
}

// Affichage de l'adresse
printf("L'hôte %s est en ligne\n", ip);
}

// Fermeture socket
close(sockfd);
}
18 changes: 18 additions & 0 deletions examples/c/network/src/cartographie/cartographie.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#ifndef CARTOGRAPHIE_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include "tnmap.h"

void scanHorizontal(const char* network);

#define CARTOGRAPHIE_H
#endif
54 changes: 54 additions & 0 deletions examples/c/network/src/cartographie/tnmap.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#include "tnmap.h"

// Vérifie si un hôte est actif
// Retourne un socket si l'hôte est actif, 1 sinon
int tnmap(const char* ip_addr) {
int sock;
struct sockaddr_in server;
int port;
int result[MAX_PORTS] = {0};

// Création du socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
perror("Échec de la création du socket");
return -1;
}

server.sin_addr.s_addr = inet_addr(ip_addr);
server.sin_family = AF_INET;

// Scan des ports
for (port = 1; port <= MAX_PORTS; port++) {
server.sin_port = htons(port);

// Connexion à l'hôte distant
if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
result[port - 1] = 0; // Port fermé
} else {
result[port - 1] = 1; // Port ouvert
close(sock);
sock = socket(AF_INET, SOCK_STREAM, 0); // Socket pour le prochain port
if (sock == -1) {
perror("Échec de la création du socket");
return -1;
}
}
}

#pragma omp parallel for
// Affichage des résultats
for (port = 1; port <= MAX_PORTS; port++) {
if (result[port - 1] == 1) {
printf("Le port %d de %s est ouvert\n", port, ip_addr);
}
}

return 1;
}

void scanVertical(const char* ip_addr) {
for (int i = 0; i < 255; i++) {
tnmap(ip_addr);
}
}
13 changes: 13 additions & 0 deletions examples/c/network/src/cartographie/tnmap.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#ifndef TNMAP_H
#define TNMAP_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAX_PORTS 65535
#endif

int tnmap(const char* ip_addr);
void scanVertical(const char* ip_addr);
24 changes: 24 additions & 0 deletions examples/c/network/src/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#include "cartographie/cartographie.h"
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
if (argc < 3) {
fprintf(stderr, "Utilisation : %s <mode> <ip>\n", argv[0]);
fprintf(stderr, "Modes :\n");
fprintf(stderr, " -h: Scan horizontal\n");
fprintf(stderr, " -v: Scan vertical\n");
fprintf(stderr, "Option:\n");
fprintf(stderr, " <ip>: IP à scanner verticalemnet or horizontalement (adresse de réseau)\n");
return 1;
}
if (strcmp(argv[1], "-h") == 0) {
scanHorizontal(argv[2]);
} else if (strcmp(argv[1], "-v") == 0) {
scanVertical(argv[2]);
} else {
fprintf(stderr, "Mode invalide\n");
return 1;
}
return 0;
}
64 changes: 64 additions & 0 deletions examples/c/network/src/tcp_cs/clientTCP.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#include "clientTCP.h"

int startClient(int argc, char *argv[]) {
int serverSocket;
/*
* Ouvrir socket (socket STREAM)
*/
if ((serverSocket = socket(PF_INET, SOCK_STREAM, 0)) <0) {
perror ("erreur socket");
exit (1);
}

struct sockaddr_in serv_addr;
/*
* Lier l'adresse locale à la socket
*/;
memset(&serv_addr, 0, sizeof(serv_addr) );
serv_addr.sin_family = AF_INET ;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(CLIENT_PORT);
if (bind(serverSocket,(struct sockaddr *)&serv_addr, sizeof(serv_addr) ) <0) {
perror ("servecho: erreur bind\n");
exit (1);
}

/*
* Remplir la structure serv_addr avec
l'adresse du serveur
*/
bzero( (char *) &serv_addr, sizeof(serv_addr) );
serv_addr.sin_family = AF_INET;

if (argc != 3) {
fprintf(stderr, "usage : %s <adresse IP> <port>\n", argv[0]);
exit(1);
}
serv_addr.sin_port = htons((uint16_t) atoi(argv[2]));
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
if (connect(serverSocket, (struct sockaddr *) &serv_addr, sizeof(serv_addr) ) < 0){
perror ("cliecho : erreur connect");
return 1;
}
char buffer[280];
int n;
while (1) {
printf("cliecho : message à envoyer : ");
memset(buffer, 0, sizeof(buffer));
scanf("%s", buffer);
n = write(serverSocket, buffer, strlen(buffer));
if (n < 0) {
perror("cliecho : erreur write\n");
close(serverSocket);
return 1;
}
memset(buffer, 0, sizeof(buffer));
n = read(serverSocket, buffer, 280);
if (n < 0) {
perror("cliecho : erreur read\n");
close(serverSocket);
return 1;
}
printf("cliecho : message reçu : %s\n", buffer);
}
}
Loading