@@ -27,19 +27,20 @@ const (
27
27
)
28
28
29
29
const (
30
- RequestNone = 255
31
- RequestSendSave = 1
32
- RequestReceiveSave = 2
33
- RequestSendSettings = 3
34
- RequestReceiveSettings = 4
35
- RequestRegisterPlayer = 5
36
- RequestGetRegistration = 6
37
- RequestDisconnectNotice = 7
38
- RequestSendCustomStart = 64 // 64-127 are custom data send slots, 128-191 are custom data receive slots
39
- CustomDataOffset = 64
30
+ RequestNone = 255
31
+ RequestSendSave = 1
32
+ RequestReceiveSave = 2
33
+ RequestSendSettings = 3
34
+ RequestReceiveSettings = 4
35
+ RequestRegisterPlayer = 5
36
+ RequestGetRegistration = 6
37
+ RequestDisconnectNotice = 7
38
+ RequestReceiveSaveWithSize = 8
39
+ RequestSendCustomStart = 64 // 64-127 are custom data send slots, 128-191 are custom data receive slots
40
+ CustomDataOffset = 64
40
41
)
41
42
42
- func (g * GameServer ) tcpSendFile (tcpData * TCPData , conn * net.TCPConn ) {
43
+ func (g * GameServer ) tcpSendFile (tcpData * TCPData , conn * net.TCPConn , withSize bool ) {
43
44
startTime := time .Now ()
44
45
var ok bool
45
46
for ! ok {
@@ -51,11 +52,22 @@ func (g *GameServer) tcpSendFile(tcpData *TCPData, conn *net.TCPConn) {
51
52
return
52
53
}
53
54
} else {
54
- _ , err := conn .Write (g .TCPFiles [tcpData .Filename ])
55
- if err != nil {
56
- g .Logger .Error (err , "could not write file" , "address" , conn .RemoteAddr ().String ())
55
+ if withSize {
56
+ size := make ([]byte , 4 ) //nolint:gomnd,mnd
57
+ binary .BigEndian .PutUint32 (size , uint32 (len (g .TCPFiles [tcpData .Filename ]))) //nolint:gosec
58
+ _ , err := conn .Write (size )
59
+ if err != nil {
60
+ g .Logger .Error (err , "could not write size" , "address" , conn .RemoteAddr ().String ())
61
+ }
62
+ }
63
+ if len (g .TCPFiles [tcpData .Filename ]) > 0 {
64
+ _ , err := conn .Write (g .TCPFiles [tcpData .Filename ])
65
+ if err != nil {
66
+ g .Logger .Error (err , "could not write file" , "address" , conn .RemoteAddr ().String ())
67
+ }
57
68
}
58
- // g.Logger.Info("sent file", "filename", tcpData.Filename, "filesize", tcpData.Filesize, "address", conn.RemoteAddr().String())
69
+
70
+ // g.Logger.Info("sent save file", "filename", tcpData.Filename, "filesize", tcpData.Filesize, "address", conn.RemoteAddr().String())
59
71
tcpData .Filename = ""
60
72
tcpData .Filesize = 0
61
73
}
@@ -164,7 +176,7 @@ func (g *GameServer) processTCP(conn *net.TCPConn) {
164
176
}
165
177
}
166
178
167
- if (tcpData .Request == RequestSendSave || tcpData .Request == RequestReceiveSave ) && tcpData .Filename == "" { // get file name
179
+ if (tcpData .Request == RequestSendSave || tcpData .Request == RequestReceiveSave || tcpData . Request == RequestReceiveSaveWithSize ) && tcpData .Filename == "" { // get file name
168
180
if bytes .IndexByte (tcpData .Buffer .Bytes (), 0 ) != - 1 {
169
181
filenameBytes , err := tcpData .Buffer .ReadBytes (0 )
170
182
if err != nil {
@@ -182,6 +194,13 @@ func (g *GameServer) processTCP(conn *net.TCPConn) {
182
194
g .Logger .Error (err , "TCP error" , "address" , conn .RemoteAddr ().String ())
183
195
}
184
196
tcpData .Filesize = binary .BigEndian .Uint32 (filesizeBytes )
197
+
198
+ if tcpData .Filesize == 0 {
199
+ g .TCPFiles [tcpData .Filename ] = make ([]byte , tcpData .Filesize )
200
+ tcpData .Filename = ""
201
+ tcpData .Filesize = 0
202
+ tcpData .Request = RequestNone
203
+ }
185
204
}
186
205
}
187
206
@@ -192,15 +211,20 @@ func (g *GameServer) processTCP(conn *net.TCPConn) {
192
211
if err != nil {
193
212
g .Logger .Error (err , "TCP error" , "address" , conn .RemoteAddr ().String ())
194
213
}
195
- // g.Logger.Info("read file from sender ", "filename", tcpData.Filename, "filesize", tcpData.Filesize, "address", conn.RemoteAddr().String())
214
+ g .Logger .Info ("received save file " , "filename" , tcpData .Filename , "filesize" , tcpData .Filesize , "address" , conn .RemoteAddr ().String ())
196
215
tcpData .Filename = ""
197
216
tcpData .Filesize = 0
198
217
tcpData .Request = RequestNone
199
218
}
200
219
}
201
220
202
221
if tcpData .Request == RequestReceiveSave && tcpData .Filename != "" { // send requested file
203
- go g .tcpSendFile (tcpData , conn )
222
+ go g .tcpSendFile (tcpData , conn , false )
223
+ tcpData .Request = RequestNone
224
+ }
225
+
226
+ if tcpData .Request == RequestReceiveSaveWithSize && tcpData .Filename != "" { // send requested file
227
+ go g .tcpSendFile (tcpData , conn , true )
204
228
tcpData .Request = RequestNone
205
229
}
206
230
0 commit comments