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;
}
}
* ------------------------------------------------------------------- */
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) {