aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/vhost/main.go83
1 files changed, 78 insertions, 5 deletions
diff --git a/cmd/vhost/main.go b/cmd/vhost/main.go
index 57f5f7c..7c32df8 100644
--- a/cmd/vhost/main.go
+++ b/cmd/vhost/main.go
@@ -25,6 +25,10 @@ func main() {
}
ipstack.RegisterProtocolHandler(ipstack.TEST_PROTOCOL)
ipstack.RegisterProtocolHandler(ipstack.TCP_PROTOCOL)
+
+ // create a map of sockets
+ sockets := make(map[int]*ipstack.VTCPConn)
+
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
@@ -97,12 +101,20 @@ func main() {
fmt.Println(err)
continue
}
- _, err = listener.VAccept()
- if err != nil {
- fmt.Println(err)
+ go func() {
+ for {
+ conn, err := listener.VAccept()
+ if err != nil {
+ fmt.Println(err)
+ }
+ sockets[conn.Socket] = conn
+ }
+ }()
+ case "c":
+ if len(tokens) != 3 {
+ fmt.Println("Invalid command: ", line)
continue
}
- case "c":
// connect to a port
vipAddr := tokens[1]
port := tokens[2]
@@ -111,15 +123,76 @@ func main() {
fmt.Println(err)
continue
}
- _, err = ipstack.VConnect(vipAddr, uint16(uint16Port))
+ conn, err := ipstack.VConnect(vipAddr, uint16(uint16Port))
if err != nil {
fmt.Println(err)
continue
}
+ sockets[conn.Socket] = conn
case "ls":
// list sockets
fmt.Println("SID\tLAddr\t\tLPort\tRAddr\t\tRPort\tRStatus")
fmt.Println(ipstack.SprintSockets())
+ case "s":
+ if len(tokens) < 3 {
+ fmt.Println("Invalid command: ", line)
+ continue
+ }
+ socketID, err := strconv.Atoi(tokens[1])
+ if err != nil {
+ fmt.Println(err)
+ continue
+ }
+ conn, _ := sockets[socketID]
+ message := tokens[2:]
+ messageToSend := strings.Join(message, " ")
+ messageToSendBytes := []byte(messageToSend)
+ bytesWritten, err := conn.VWrite(messageToSendBytes)
+ if err != nil {
+ fmt.Println(err)
+ continue
+ }
+ fmt.Printf("Sent %d bytes\n", bytesWritten)
+ case "r":
+ if len(tokens) != 3 {
+ fmt.Println("Invalid command: ", line)
+ continue
+ }
+ socketID, err := strconv.Atoi(tokens[1])
+ if err != nil {
+ fmt.Println(err)
+ continue
+ }
+ numberOfBytes, err := strconv.Atoi(tokens[2])
+ if err != nil {
+ fmt.Println(err)
+ continue
+ }
+ conn, _ := sockets[socketID]
+ // buffer := make([]byte, numberOfBytes)
+ bytesRead, message, err := conn.VRead(numberOfBytes)
+ if err != nil {
+ fmt.Println(err)
+ continue
+ }
+ fmt.Printf("Read %d bytes: %s\n", bytesRead, message)
+ case "cl":
+ // close a socket
+ if len(tokens) != 2 {
+ fmt.Println("Invalid command: ", line)
+ continue
+ }
+ socketID, err := strconv.Atoi(tokens[1])
+ if err != nil {
+ fmt.Println(err)
+ continue
+ }
+ conn, _ := sockets[socketID]
+ err = conn.VClose()
+ if err != nil {
+ fmt.Println(err)
+ continue
+ }
default:
fmt.Println("Invalid command: ", line)
fmt.Println("Commands: ")