diff options
author | David Doan <daviddoan@Davids-MacBook-Pro-70.local> | 2023-11-07 17:20:48 -0500 |
---|---|---|
committer | David Doan <daviddoan@Davids-MacBook-Pro-70.local> | 2023-11-07 17:20:48 -0500 |
commit | f8ea46a281d473f5db097b25755321d87e9686e4 (patch) | |
tree | 0b337a7251d057033b74d8d7707c17e33740e132 /cmd | |
parent | db7b6b45836052ae23c7c318c36208fe531b91ab (diff) |
working on milestone 2
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/vhost/main.go | 83 |
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: ") |