learning_go/book_with_bridge/ftp_server/ftp/dataconn.go
2026-01-03 18:10:08 +03:00

65 lines
1.1 KiB
Go

package ftp
import "net"
func (c *Conn) dataConnect() (net.Conn, error) {
conn, err := net.Dial("tcp", c.dataPort.toAddress())
if err != nil {
return nil, err
}
return conn, nil
}
dataConn, err = c.dataConnect()
if err != nil {
log.Print(err)
c.respond(status425)
return
}
defer dataConn.Close()
for _, file := range files {
_, err := fmt.Fprint(dataConn, file.Name(), c.EOL())
if err != nil {
log.Print(err)
c.respond(status426)
}
}
_, err = fmt.Fprintf(dataConn, c.EOL())
if err != nil {
log.Print(err)
c.respond(status426)
}
c.respond(status226)
func (c *Conn) retr(args []string) {
if len(args) != 1 {
c.respond(status501)
return
}
path := filepath.Join(c.rootDir, c.workDir, args[0])
file, err := os.Open(path)
if err != nil {
log.Print(err)
c.respond(status550)
}
c.respond(status150)
dataConn, err := c.dataConnect()
if err != nil {
log.Print(err)
c.respond(status425)
}
defer dataConn.Close()
_, err = io.Copy(dataConn, file)
if err != nil {
log.Print(err)
c.respond(status426)
return
}
io.WriteString(dataConn, c.EOL())
c.respond(status226)
}