]> sjero.net Git - iperf/blobdiff - src/Client.cpp
Support for continuous runs
[iperf] / src / Client.cpp
index 2195c4fd3027c8b34f9da14273af7ffcca75b310..6a64991680340cae8374e202a53fc89b3702bad5 100644 (file)
@@ -90,10 +90,7 @@ Client::Client( thread_Settings *inSettings ) {
         ReportSettings( inSettings );
         if ( mSettings->multihdr && isMultipleReport( inSettings ) ) {
             mSettings->multihdr->report->connection.peer = mSettings->peer;
-            mSettings->multihdr->report->connection.size_peer = mSettings->size_peer;
             mSettings->multihdr->report->connection.local = mSettings->local;
-            SockAddr_setPortAny( &mSettings->multihdr->report->connection.local );
-            mSettings->multihdr->report->connection.size_local = mSettings->size_local;
         }
     }
 
@@ -132,7 +129,10 @@ void Client::Run( void ) {
     // setup termination variables
     if ( mMode_Time ) {
         mEndTime.setnow();
-        mEndTime.add( mSettings->mAmount / 100.0 );
+        if (mSettings->mAmount == 0)
+            mEndTime.add(2209032.0);           // 7 years - i.e. continuous
+        else
+            mEndTime.add(mSettings->mAmount / 100.0);
     }
 
     if ( isPacketOriented( mSettings ) ) {
@@ -308,34 +308,12 @@ void Client::InitiateServer()
  * ------------------------------------------------------------------- */
 void Client::Connect()
 {
-    int rc;
-
-    assert( mSettings->inHostname != NULL );
-
-    // The local socket needs to be filled in first, since the
-    // IPv6 address testing for the peer depends on the type of
-    // the local socket
-    SockAddr_localAddr( mSettings );
-    SockAddr_remoteAddr( mSettings );
-    MakeSocket( mSettings);
-    SetSocketOptions( mSettings );
-
-    if ( mSettings->mLocalhost != NULL ) {
-        // bind socket to local address
-        rc = bind( mSettings->mSock, (sockaddr*) &mSettings->local, 
-                   SockAddr_get_sizeof_sockaddr( &mSettings->local ) );
-        WARN_errno( rc == SOCKET_ERROR, "bind" );
-    }
+    socklen_t size_local = sizeof(mSettings->local);
 
-    // connect socket
-    rc = connect( mSettings->mSock, (sockaddr*) &mSettings->peer, 
-                  SockAddr_get_sizeof_sockaddr( &mSettings->peer ));
-    WARN_errno( rc == SOCKET_ERROR, "connect" );
+    MakeSocket(mSettings);
 
-    getsockname( mSettings->mSock, (sockaddr*) &mSettings->local, 
-                 &mSettings->size_local );
-    getpeername( mSettings->mSock, (sockaddr*) &mSettings->peer,
-                 &mSettings->size_peer );
+    /* determine local interface after establishing the connection */
+    getsockname(mSettings->mSock, (struct sockaddr *)&mSettings->local, &size_local);
 
     /* The DCCP packet size must not exceed the MPS (RFC 4340, 14.) */
     if (mSettings->mProtocol == kProto_DCCP) {