diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 0ba6e1b..0605f83 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -5,9 +5,11 @@
-
-
+
+
+
+
@@ -56,59 +58,59 @@
-
+
+
-
+
-
+
-
+
-
+
-
+
-
diff --git a/client.go b/client.go
index 58ec83e..c38006c 100644
--- a/client.go
+++ b/client.go
@@ -489,15 +489,24 @@ func (c *Client) SetModeLive() <-chan *StreamIntervalReport {
}
func (c *Client) Start() (err error) {
+ _, err = c.start()
+ return err
+}
+
+func (c *Client) StartEx() (pid int, err error) {
+ return c.start()
+}
+
+func (c *Client) start() (pid int, err error) {
read := make(chan interface{})
cmd, err := c.commandString()
if err != nil {
- return err
+ return -1, err
}
var exit chan int
- c.outputStream, c.errorStream, exit, c.cancel, err = ExecuteAsyncWithCancelReadIndicator(cmd, read)
+ c.outputStream, c.errorStream, exit, c.cancel, pid, err = ExecuteAsyncWithCancelReadIndicator(cmd, read)
if err != nil {
- return err
+ return -1, err
}
c.Running = true
@@ -548,7 +557,7 @@ func (c *Client) Start() (err error) {
reporter.Stop()
}
}()
- return nil
+ return pid, nil
}
func (c *Client) Stop() {
diff --git a/cmd/main.go b/cmd/main.go
index c2ea8fb..d924131 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -2,45 +2,47 @@ package main
import (
//"fmt"
-//"github.com/BGrewell/go-conversions"
+ "github.com/BGrewell/go-conversions"
//"github.com/BGrewell/go-iperf"
//"time"
+ "fmt"
+ "github.com/BGrewell/go-iperf"
+ "time"
)
func main() {
- //s := iperf.NewServer()
- //c := iperf.NewClient("127.0.0.1")
- //includeServer := true
- //c.IncludeServer = &includeServer
- //fmt.Println(s.Id)
- //fmt.Println(c.Id)
- //
- //err := s.Start()
- //if err != nil {
- // fmt.Println(err)
- //}
- //
- //err = c.Start()
- //if err != nil {
- // fmt.Println(err)
- //}
- //
- //for c.Running {
- // time.Sleep(1 * time.Second)
- //}
- //
- //fmt.Println("stopping server")
- //s.Stop()
- //
- //fmt.Printf("Client exit code: %d\n", *c.ExitCode)
- //fmt.Printf("Server exit code: %d\n", *s.ExitCode)
- //iperf.Cleanup()
- //if c.Report.Error != "" {
- // fmt.Println(c.Report.Error)
- //} else {
- // fmt.Printf("Recv Rate: %s\n", conversions.IntBitRateToString(int64(c.Report.End.SumReceived.BitsPerSecond)))
- // fmt.Printf("Send Rate: %s\n", conversions.IntBitRateToString(int64(c.Report.End.SumSent.BitsPerSecond)))
- //}
+ s := iperf.NewServer()
+ c := iperf.NewClient("127.0.0.1")
+ c.SetIncludeServer(true)
+ fmt.Println(s.Id)
+ fmt.Println(c.Id)
+
+ err := s.Start()
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ err = c.Start()
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ for c.Running {
+ time.Sleep(1 * time.Second)
+ }
+
+ fmt.Println("stopping server")
+ s.Stop()
+
+ fmt.Printf("Client exit code: %d\n", *c.ExitCode())
+ fmt.Printf("Server exit code: %d\n", *s.ExitCode)
+ iperf.Cleanup()
+ if c.Report().Error != "" {
+ fmt.Println(c.Report().Error)
+ } else {
+ fmt.Printf("Recv Rate: %s\n", conversions.IntBitRateToString(int64(c.Report().End.SumReceived.BitsPerSecond)))
+ fmt.Printf("Send Rate: %s\n", conversions.IntBitRateToString(int64(c.Report().End.SumSent.BitsPerSecond)))
+ }
}
diff --git a/execute.go b/execute.go
index f8ae6d3..3bdebb4 100644
--- a/execute.go
+++ b/execute.go
@@ -42,34 +42,38 @@ func ExecuteAsync(cmd string) (outPipe io.ReadCloser, errPipe io.ReadCloser, exi
return outPipe, errPipe, exitCode, nil
}
-func ExecuteAsyncWithCancel(cmd string) (stdOut io.ReadCloser, stdErr io.ReadCloser, exitCode chan int, cancelToken context.CancelFunc, err error) {
+func ExecuteAsyncWithCancel(cmd string) (stdOut io.ReadCloser, stdErr io.ReadCloser, exitCode chan int, cancelToken context.CancelFunc, pid int, err error) {
return ExecuteAsyncWithCancelReadIndicator(cmd, nil)
}
-func ExecuteAsyncWithCancelReadIndicator(cmd string, readIndicator chan interface{}) (stdOut io.ReadCloser, stdErr io.ReadCloser, exitCode chan int, cancelToken context.CancelFunc, err error) {
+func ExecuteAsyncWithCancelReadIndicator(cmd string, readIndicator chan interface{}) (stdOut io.ReadCloser, stdErr io.ReadCloser, exitCode chan int, cancelToken context.CancelFunc, pid int, err error) {
+ return executeAsyncWithCancel(cmd, readIndicator)
+}
+
+func executeAsyncWithCancel(cmd string, readIndicator chan interface{}) (stdOut io.ReadCloser, stdErr io.ReadCloser, exitCode chan int, cancelToken context.CancelFunc, pid int, err error) {
exitCode = make(chan int)
ctx, cancel := context.WithCancel(context.Background())
cmdParts := strings.Fields(cmd)
binary, err := exec.LookPath(cmdParts[0])
if err != nil {
defer cancel()
- return nil, nil, nil, nil, err
+ return nil, nil, nil, nil, -1, err
}
exe := exec.CommandContext(ctx, binary, cmdParts[1:]...)
stdOut, err = exe.StdoutPipe()
if err != nil {
defer cancel()
- return nil, nil, nil, nil, err
+ return nil, nil, nil, nil, -1, err
}
stdErr, err = exe.StderrPipe()
if err != nil {
defer cancel()
- return nil, nil, nil, nil, err
+ return nil, nil, nil, nil, -1, err
}
err = exe.Start()
if err != nil {
defer cancel()
- return nil, nil, nil, nil, err
+ return nil, nil, nil, nil, -1, err
}
go func() {
// Note: Wait() will close the Stdout/Stderr and in some cases can do it before we read. In order to prevent
@@ -87,5 +91,5 @@ func ExecuteAsyncWithCancelReadIndicator(cmd string, readIndicator chan interfac
exitCode <- 0
}
}()
- return stdOut, stdErr, exitCode, cancel, nil
-}
+ return stdOut, stdErr, exitCode, cancel, exe.Process.Pid, nil
+}
\ No newline at end of file
diff --git a/server.go b/server.go
index e3a11ff..aa49973 100644
--- a/server.go
+++ b/server.go
@@ -151,14 +151,23 @@ func (s *Server) SetLogFile(filename string) {
}
func (s *Server) Start() (err error) {
+ _, err = s.start()
+ return err
+}
+
+func (s *Server) StartEx() (pid int, err error) {
+ return s.start()
+}
+
+func (s *Server) start() (pid int, err error) {
cmd, err := s.commandString()
if err != nil {
- return err
+ return -1, err
}
var exit chan int
- s.outputStream, s.errorStream, exit, s.cancel, err = ExecuteAsyncWithCancel(cmd)
+ s.outputStream, s.errorStream, exit, s.cancel, pid, err = ExecuteAsyncWithCancel(cmd)
if err != nil {
- return err
+ return -1, err
}
s.Running = true
@@ -176,7 +185,7 @@ func (s *Server) Start() (err error) {
s.ExitCode = &exitCode
s.Running = false
}()
- return nil
+ return pid,nil
}
func (s *Server) Stop() {