]> sjero.net Git - iperf/blobdiff - src/PerfSocket.cpp
Add a --bindport option to specify the client source port
[iperf] / src / PerfSocket.cpp
index de88a753f8709600ddd91ee1b30da4e9b842511d..3a3b4561d69b9947859d69779cf8b94c418cb443 100644 (file)
@@ -179,7 +179,7 @@ void SetSocketOptions( thread_Settings *inSettings )
     }
 
     // reuse the address, so we can run if a former server was killed off
-    if (inSettings->mThreadMode == kMode_Listener) {
+    if (inSettings->mThreadMode == kMode_Listener || inSettings->mBindPort > 0) {
        val = 1;
        rc = setsockopt(inSettings->mSock, SOL_SOCKET, SO_REUSEADDR, &val, len);
         WARN_errno( rc == SOCKET_ERROR, "setsockopt SO_REUSEADDR" );
@@ -191,6 +191,7 @@ void MakeSocket(thread_Settings *inSettings)
        struct addrinfo *local = NULL, *src,
                        *remote = NULL, *dst, hints;
        char            port[6];
+       char            lport[6];
        int             rc, socktype = sockType(inSettings->mProtocol);
 
        assert(inSettings->mLocalhost || inSettings->mHost);
@@ -198,6 +199,11 @@ void MakeSocket(thread_Settings *inSettings)
         memset(&inSettings->local, 0, sizeof(inSettings->local));
         memset(&inSettings->peer,  0, sizeof(inSettings->peer));
        sprintf(port, "%u", inSettings->mPort);
+       if(inSettings->mBindPort > 0){
+               sprintf(lport, "%u", inSettings->mBindPort);
+       }else{
+               sprintf(lport, "%u", inSettings->mPort);
+       }
 
        /*
         *      Set up address hint structure
@@ -222,12 +228,12 @@ void MakeSocket(thread_Settings *inSettings)
        /*
         *      Obtain local/remote address information
         */
-       if (inSettings->mLocalhost || inSettings->mThreadMode == kMode_Listener) {
-               if (inSettings->mLocalhost == NULL)
+       if (inSettings->mLocalhost || inSettings->mBindPort > 0 || inSettings->mThreadMode == kMode_Listener) {
+               if (inSettings->mThreadMode == kMode_Listener)
                        hints.ai_flags |= AI_PASSIVE;
-               if ((rc = getaddrinfo(inSettings->mLocalhost, port, &hints, &local)))
+               if ((rc = getaddrinfo(inSettings->mLocalhost, lport, &hints, &local)))
                        die("Can not resolve local address %s#%s: %s",
-                           inSettings->mLocalhost ? : "(local)", port, gai_strerror(rc));
+                           inSettings->mLocalhost ? : "(local)", lport, gai_strerror(rc));
        }
 
        if (inSettings->mHost && inSettings->mThreadMode != kMode_Listener) {