@@ -9,8 +9,11 @@ import (
9
9
"strconv"
10
10
"sync"
11
11
12
- "github.com/netsec-ethz/scion-apps/netcat/utils"
12
+ quic "github.com/lucas-clemente/quic-go"
13
+ "github.com/netsec-ethz/scion-apps/lib/scionutil"
13
14
"github.com/scionproto/scion/go/lib/log"
15
+ "github.com/scionproto/scion/go/lib/snet"
16
+ "github.com/scionproto/scion/go/lib/snet/squic"
14
17
)
15
18
16
19
func printUsage () {
@@ -19,7 +22,7 @@ func printUsage() {
19
22
fmt .Println ("Example SCION address: 17-ffaa:1:bfd,[127.0.0.1]:42002" )
20
23
fmt .Println ("Available flags:" )
21
24
fmt .Println (" -h: Show help" )
22
- fmt .Println (" -local: Use IA when resolving SCIOND socket path " )
25
+ fmt .Println (" -local: Local SCION address (default localhost) " )
23
26
fmt .Println (" -b: Send an extra byte before sending the actual data" )
24
27
}
25
28
@@ -28,13 +31,13 @@ func main() {
28
31
log .Debug ("Launching netcat" )
29
32
30
33
var (
31
- serverAddress string
32
- port uint16
33
- useIASCIONDPath bool
34
- extraByte bool
34
+ remoteAddressString string
35
+ port uint16
36
+ localAddrString string
37
+ extraByte bool
35
38
)
36
39
flag .Usage = printUsage
37
- flag .BoolVar ( & useIASCIONDPath , "local" , false , "Use IA SCIOND Path " )
40
+ flag .StringVar ( & remoteAddressString , "local" , "" , "Local address string " )
38
41
flag .BoolVar (& extraByte , "b" , false , "Send extra byte" )
39
42
flag .Parse ()
40
43
@@ -44,29 +47,51 @@ func main() {
44
47
golog .Panicf ("Number of arguments is not two! Arguments: %v" , tail )
45
48
}
46
49
47
- serverAddress = tail [0 ]
50
+ remoteAddressString = tail [0 ]
48
51
port64 , err := strconv .ParseUint (tail [1 ], 10 , 16 )
49
52
if err != nil {
50
53
printUsage ()
51
54
golog .Panicf ("Can't parse port string %v: %v" , port64 , err )
52
55
}
53
56
port = uint16 (port64 )
54
57
58
+ if localAddrString == "" {
59
+ localAddrString , err = scionutil .GetLocalhostString ()
60
+ if err != nil {
61
+ golog .Panicf ("Error getting localhost: %v" , err )
62
+ }
63
+ }
64
+
65
+ localAddr , err := snet .AddrFromString (localAddrString )
66
+ if err != nil {
67
+ golog .Panicf ("Error parsing local address: %v" , err )
68
+ }
69
+
55
70
// Initialize SCION library
56
- err = utils .InitSCION ("" , "" , useIASCIONDPath )
71
+ err = scionutil .InitSCION (localAddr )
57
72
if err != nil {
58
73
golog .Panicf ("Error initializing SCION connection: %v" , err )
59
74
}
60
75
61
- conn , err := utils . DialSCION (fmt .Sprintf ("%s:%v" , serverAddress , port ))
76
+ remoteAddr , err := snet . AddrFromString (fmt .Sprintf ("%s:%v" , remoteAddressString , port ))
62
77
if err != nil {
63
- golog .Panicf ("Error dialing remote: %v" , err )
78
+ golog .Panicf ("Can't parse remote address %s: %v" , remoteAddressString )
79
+ }
80
+
81
+ sess , err := squic .DialSCION (nil , localAddr , remoteAddr , & quic.Config {KeepAlive : true })
82
+ if err != nil {
83
+ golog .Panicf ("Can't dial remote address %s: %v" , remoteAddressString , err )
84
+ }
85
+
86
+ stream , err := sess .OpenStreamSync ()
87
+ if err != nil {
88
+ golog .Panicf ("Can't open stream: %v" , err )
64
89
}
65
90
66
91
log .Debug ("Connected!" )
67
92
68
93
if extraByte {
69
- _ , err := conn .Write ([]byte {71 })
94
+ _ , err := stream .Write ([]byte {71 })
70
95
if err != nil {
71
96
golog .Panicf ("Error writing extra byte: %v" , err )
72
97
}
@@ -75,15 +100,22 @@ func main() {
75
100
}
76
101
77
102
close := func () {
78
- conn .Close ()
103
+ err := stream .Close ()
104
+ if err != nil {
105
+ log .Warn ("Error closing stream: %v" , err )
106
+ }
107
+ err = sess .Close (nil )
108
+ if err != nil {
109
+ log .Warn ("Error closing session: %v" , err )
110
+ }
79
111
}
80
112
81
113
var once sync.Once
82
114
go func () {
83
- io .Copy (os .Stdout , conn )
115
+ io .Copy (os .Stdout , stream )
84
116
once .Do (close )
85
117
}()
86
- io .Copy (conn , os .Stdin )
118
+ io .Copy (stream , os .Stdin )
87
119
once .Do (close )
88
120
89
121
log .Debug ("Exiting snetcat..." )
0 commit comments