@@ -21,6 +21,8 @@ import (
21
21
"context"
22
22
"errors"
23
23
"net"
24
+ "strconv"
25
+ "strings"
24
26
"sync"
25
27
"syscall"
26
28
"time"
@@ -45,6 +47,7 @@ type Client struct {
45
47
func NewClient (eventHandler EventHandler , opts ... Option ) (cli * Client , err error ) {
46
48
options := loadOptions (opts ... )
47
49
cli = new (Client )
50
+ cli .opts = options
48
51
var logger logging.Logger
49
52
if options .LogPath != "" {
50
53
if logger , cli .logFlush , err = logging .CreateLoggerAsLocalFile (options .LogPath , options .LogLevel ); err != nil {
@@ -59,7 +62,6 @@ func NewClient(eventHandler EventHandler, opts ...Option) (cli *Client, err erro
59
62
if options .Codec == nil {
60
63
cli .opts .Codec = new (BuiltInFrameCodec )
61
64
}
62
- cli .opts = options
63
65
var p * netpoll.Poller
64
66
if p , err = netpoll .OpenPoller (); err != nil {
65
67
return
@@ -68,7 +70,7 @@ func NewClient(eventHandler EventHandler, opts ...Option) (cli *Client, err erro
68
70
svr .opts = options
69
71
svr .eventHandler = eventHandler
70
72
svr .ln = new (listener )
71
-
73
+ svr . ln . network = "udp"
72
74
svr .cond = sync .NewCond (& sync.Mutex {})
73
75
if options .Ticker {
74
76
svr .tickerCtx , svr .cancelTicker = context .WithCancel (context .Background ())
@@ -83,6 +85,7 @@ func NewClient(eventHandler EventHandler, opts ...Option) (cli *Client, err erro
83
85
options .ReadBufferCap = toolkit .CeilToPowerOfTwo (rbc )
84
86
}
85
87
el .buffer = make ([]byte , options .ReadBufferCap )
88
+ el .udpSockets = make (map [int ]* conn )
86
89
el .connections = make (map [int ]* conn )
87
90
el .eventHandler = eventHandler
88
91
cli .el = el
@@ -94,7 +97,7 @@ func (cli *Client) Start() error {
94
97
cli .el .eventHandler .OnInitComplete (Server {})
95
98
cli .el .svr .wg .Add (1 )
96
99
go func () {
97
- cli .el .activateSubReactor (cli .opts .LockOSThread )
100
+ cli .el .loopRun (cli .opts .LockOSThread )
98
101
cli .el .svr .wg .Done ()
99
102
}()
100
103
// Start the ticker.
@@ -149,16 +152,19 @@ func (cli *Client) Dial(network, address string) (Conn, error) {
149
152
return nil , e
150
153
}
151
154
152
- if cli .opts .TCPNoDelay == TCPNoDelay {
153
- if err = socket .SetNoDelay (DupFD , 1 ); err != nil {
154
- return nil , err
155
+ if strings .HasPrefix (network , "tcp" ) {
156
+ if cli .opts .TCPNoDelay == TCPNoDelay {
157
+ if err = socket .SetNoDelay (DupFD , 1 ); err != nil {
158
+ return nil , err
159
+ }
155
160
}
156
- }
157
- if cli .opts .TCPKeepAlive > 0 {
158
- if err = socket . SetKeepAlive ( DupFD , int ( cli . opts . TCPKeepAlive / time . Second )); err != nil {
159
- return nil , err
161
+ if cli . opts . TCPKeepAlive > 0 {
162
+ if err = socket . SetKeepAlive ( DupFD , int ( cli .opts .TCPKeepAlive / time . Second )); err != nil {
163
+ return nil , err
164
+ }
160
165
}
161
166
}
167
+
162
168
if cli .opts .SocketSendBuffer > 0 {
163
169
if err = socket .SetSendBuffer (DupFD , cli .opts .SocketSendBuffer ); err != nil {
164
170
return nil , err
@@ -176,26 +182,29 @@ func (cli *Client) Dial(network, address string) (Conn, error) {
176
182
)
177
183
switch c .(type ) {
178
184
case * net.UnixConn :
179
- if sockAddr , _ , _ , err = socket .GetUnixSockAddr (c .LocalAddr ().Network (), c .LocalAddr ().String ()); err != nil {
185
+ if sockAddr , _ , _ , err = socket .GetUnixSockAddr (c .RemoteAddr ().Network (), c .RemoteAddr ().String ()); err != nil {
180
186
return nil , err
181
187
}
188
+ ua := c .LocalAddr ().(* net.UnixAddr )
189
+ ua .Name = c .RemoteAddr ().String () + "." + strconv .Itoa (DupFD )
182
190
gc = newTCPConn (DupFD , cli .el , sockAddr , cli .opts .Codec , c .LocalAddr (), c .RemoteAddr ())
183
191
case * net.TCPConn :
184
- if sockAddr , _ , _ , _ , err = socket .GetTCPSockAddr (c .LocalAddr ().Network (), c .LocalAddr ().String ()); err != nil {
192
+ if sockAddr , _ , _ , _ , err = socket .GetTCPSockAddr (c .RemoteAddr ().Network (), c .RemoteAddr ().String ()); err != nil {
185
193
return nil , err
186
194
}
187
195
gc = newTCPConn (DupFD , cli .el , sockAddr , cli .opts .Codec , c .LocalAddr (), c .RemoteAddr ())
188
196
case * net.UDPConn :
189
- if sockAddr , _ , _ , _ , err = socket .GetUDPSockAddr (c .LocalAddr ().Network (), c .LocalAddr ().String ()); err != nil {
197
+ if sockAddr , _ , _ , _ , err = socket .GetUDPSockAddr (c .RemoteAddr ().Network (), c .RemoteAddr ().String ()); err != nil {
190
198
return nil , err
191
199
}
192
- gc = newUDPConn (DupFD , cli .el , c .LocalAddr (), sockAddr )
200
+ gc = newUDPConn (DupFD , cli .el , c .LocalAddr (), sockAddr , true )
193
201
default :
194
202
return nil , gerrors .ErrUnsupportedProtocol
195
203
}
196
204
err = cli .el .poller .UrgentTrigger (cli .el .loopRegister , gc )
197
205
if err != nil {
198
206
gc .Close ()
207
+ return nil , err
199
208
}
200
209
return gc , nil
201
210
}
0 commit comments