@@ -27,19 +27,20 @@ const (
2727)
2828
2929const (
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
4041)
4142
42- func (g * GameServer ) tcpSendFile (tcpData * TCPData , conn * net.TCPConn ) {
43+ func (g * GameServer ) tcpSendFile (tcpData * TCPData , conn * net.TCPConn , withSize bool ) {
4344 startTime := time .Now ()
4445 var ok bool
4546 for ! ok {
@@ -51,11 +52,22 @@ func (g *GameServer) tcpSendFile(tcpData *TCPData, conn *net.TCPConn) {
5152 return
5253 }
5354 } 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+ }
5768 }
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())
5971 tcpData .Filename = ""
6072 tcpData .Filesize = 0
6173 }
@@ -164,7 +176,7 @@ func (g *GameServer) processTCP(conn *net.TCPConn) {
164176 }
165177 }
166178
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
168180 if bytes .IndexByte (tcpData .Buffer .Bytes (), 0 ) != - 1 {
169181 filenameBytes , err := tcpData .Buffer .ReadBytes (0 )
170182 if err != nil {
@@ -182,6 +194,13 @@ func (g *GameServer) processTCP(conn *net.TCPConn) {
182194 g .Logger .Error (err , "TCP error" , "address" , conn .RemoteAddr ().String ())
183195 }
184196 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+ }
185204 }
186205 }
187206
@@ -192,15 +211,20 @@ func (g *GameServer) processTCP(conn *net.TCPConn) {
192211 if err != nil {
193212 g .Logger .Error (err , "TCP error" , "address" , conn .RemoteAddr ().String ())
194213 }
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 ())
196215 tcpData .Filename = ""
197216 tcpData .Filesize = 0
198217 tcpData .Request = RequestNone
199218 }
200219 }
201220
202221 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 )
204228 tcpData .Request = RequestNone
205229 }
206230
0 commit comments