11use quiche:: Config ;
2+ use quiche:: ConnectionId ;
3+ use quiche:: RecvInfo ;
4+ use std:: collections:: HashMap ;
5+ use std:: error:: Error ;
6+ use std:: net:: SocketAddr ;
27use tokio:: net:: UdpSocket ;
3- use std:: { error:: Error , net:: SocketAddr } ;
48
59pub async fn start_webtransport ( ) -> Result < ( ) , Box < dyn Error > > {
610 let server_addr: SocketAddr = "0.0.0.0:4433" . parse ( ) . unwrap ( ) ;
7-
8-
11+
12+ // Configuration de Quiche
913 let mut config = Config :: new ( quiche:: PROTOCOL_VERSION ) . unwrap ( ) ;
10-
11- config. set_application_protos ( & [ b"webtransport" ] ) . unwrap ( ) ;
12-
14+ config. set_application_protos ( & [ b"h3" ] ) . unwrap ( ) ;
15+ config. set_initial_max_data ( 10_000_000 ) ;
16+ config. set_initial_max_stream_data_bidi_local ( 1_000_000 ) ;
17+ config. set_initial_max_stream_data_bidi_remote ( 1_000_000 ) ;
18+ config. set_initial_max_streams_bidi ( 100 ) ;
19+
1320 config
1421 . load_cert_chain_from_pem_file ( "localhost.pem" )
1522 . unwrap ( ) ;
@@ -18,40 +25,79 @@ pub async fn start_webtransport() -> Result<(), Box<dyn Error>> {
1825 . unwrap ( ) ;
1926 config. verify_peer ( false ) ;
2027
28+ // Création du socket UDP
2129 let socket = UdpSocket :: bind ( & server_addr) . await . unwrap ( ) ;
22-
30+ println ! ( "Serveur en écoute sur {}" , server_addr) ;
31+
32+ let mut connections: HashMap < ConnectionId , quiche:: Connection > = HashMap :: new ( ) ;
2333 let mut buf = [ 0 ; 65535 ] ;
24-
34+
2535 loop {
36+ // Recevoir des données du socket
2637 let ( read, from) = socket. recv_from ( & mut buf) . await ?;
27- println ! ( "Received {} bytes" , read) ;
28-
29- let scid = quiche:: ConnectionId :: from_vec ( vec ! [ 0 ; quiche:: MAX_CONN_ID_LEN ] ) ;
30-
31- let mut conn = match quiche:: accept ( & scid, None , server_addr, from, & mut config) {
32- Ok ( conn) => conn,
38+ println ! ( "Reçu {} bytes de {}" , read, from) ;
39+
40+ // Identifier la connexion
41+ let scid = ConnectionId :: from_ref ( & buf[ ..quiche:: MAX_CONN_ID_LEN ] . to_vec ( ) ) ;
42+
43+ // Accepter ou récupérer la connexion
44+ let conn = connections. entry ( scid. clone ( ) ) . or_insert_with ( || {
45+ quiche:: accept ( & scid, None , server_addr, from, & mut config) . unwrap ( )
46+ } ) ;
47+
48+ let recv_info = RecvInfo { from, to : server_addr } ;
49+
50+ // Traiter les données reçues
51+ match conn. recv ( & mut buf[ ..read] , recv_info) {
52+ Ok ( _) => {
53+ // Traiter les événements de la connexion
54+ process_connection ( conn, & socket) . await ?;
55+ }
3356 Err ( e) => {
34- eprintln ! ( "Failed to accept connection : {:?}" , e) ;
57+ eprintln ! ( "Erreur lors de la réception des données : {:?}" , e) ;
3558 continue ;
3659 }
37- } ;
38-
39- println ! ( "New connection: {:?}" , read) ;
40-
41- let recv_info = quiche:: RecvInfo { from, to : server_addr } ;
42-
43- if let Err ( e) = conn. recv ( & mut buf[ ..read] , recv_info) {
44- eprintln ! ( "Failed to parse packet: {:?}" , e) ;
45- continue ;
4660 }
47-
48- let mut stream_buf = [ 0 ; 1024 ] ;
49- while let Ok ( ( stream_id, _) ) = conn. stream_recv ( 0 , & mut stream_buf) {
50- let message = String :: from_utf8_lossy ( & stream_buf[ ..read] ) ;
51- println ! ( "Received message on stream {}: {}" , stream_id, message) ;
52-
53- let response = b"Hello, World!" ;
54- conn. stream_send ( stream_id. try_into ( ) . unwrap ( ) , response, true ) . unwrap ( ) ;
61+ }
62+ }
63+
64+ async fn process_connection ( conn : & mut quiche:: Connection , socket : & UdpSocket ) -> Result < ( ) , Box < dyn Error > > {
65+ // Lire les données des flux
66+ for stream_id in conn. readable ( ) {
67+ let mut buf = [ 0 ; 1024 ] ;
68+ match conn. stream_recv ( stream_id, & mut buf) {
69+ Ok ( ( len, _) ) => {
70+ if len > 0 {
71+ let message = String :: from_utf8_lossy ( & buf[ ..len] ) ;
72+ println ! ( "Message reçu sur le flux {} : {}" , stream_id, message) ;
73+
74+ // Répondre au client
75+ let response = format ! ( "Réponse du serveur : {}" , message) ;
76+ conn. stream_send ( stream_id, response. as_bytes ( ) , true ) ?;
77+ }
78+ }
79+ Err ( quiche:: Error :: Done ) => break ,
80+ Err ( e) => {
81+ eprintln ! ( "Erreur lors de la lecture du flux : {:?}" , e) ;
82+ break ;
83+ }
5584 }
5685 }
86+
87+ // Envoyer les données en attente
88+ let mut out_buf = [ 0 ; 65535 ] ;
89+ loop {
90+ let ( len, send_info) = match conn. send ( & mut out_buf) {
91+ Ok ( v) => v,
92+ Err ( quiche:: Error :: Done ) => break ,
93+ Err ( e) => {
94+ eprintln ! ( "Erreur lors de l'envoi des données: {:?}" , e) ;
95+ break ;
96+ }
97+ } ;
98+
99+ socket. send_to ( & out_buf[ ..len] , send_info. to ) . await ?;
100+ }
101+
102+ Ok ( ( ) )
57103}
0 commit comments