2011-08-14 13 views
1

私は、デフォルトで1G NICである "eth0"というインタフェースに接続する次のコードを持っていますが、 "eth5" 10G NIC。特定のネットワークインターフェイスでのC++ TCPクライアントソケットの使用Linux/Unix

class TCPClientSocket { 
    protected: 
    int socket_file_descriptor_; 

    public: 

    TCPClientSocket () 
     : socket_file_descriptor_ (-1) 
    { 
     /* socket creation */ 
     socket_file_descriptor_ = socket (AF_INET, SOCK_STREAM, 0); 
     if (socket_file_descriptor_ < 0) { exit(1); } 
    } 

    void Connect (const std::string & _ors_ip_, const int _ors_port_) { 
     struct sockaddr_in ors_Addr_ ; 
     bzero (&ors_Addr_, sizeof (ors_Addr_)) ; 
     ors_Addr_.sin_family = AF_INET; 
     ors_Addr_.sin_port = htons (_ors_port_); 
     inet_pton (AF_INET, _ors_ip_.c_str(), &(ors_Addr_.sin_addr)); 

     if (connect (socket_file_descriptor_, (struct sockaddr *) &ors_Addr_, sizeof(struct sockaddr_in)) < 0) { 
     fprintf (stderr, "connect() failed on %s:%d\n", _ors_ip_.c_str(), _ors_port_); 
     close (socket_file_descriptor_); 
     socket_file_descriptor_ = -1; 
     } 
    } 

    inline int WriteN (const unsigned int _len_, const void * _src_) const { 
     if (socket_file_descriptor_ != -1) { 
     return write (socket_file_descriptor_, _src_, _len_); 
     } 
     return -1; 
    } 

    inline int ReadN (const unsigned int _len_, void * _dest_) const { 
     if (socket_file_descriptor_ != -1) { 
     return read (socket_file_descriptor_, _dest_, _len_); 
     } 
     return -1; 
    } 

    inline bool IsOpen () const { return (socket_file_descriptor_ != -1) ; } 
    inline int socket_file_descriptor() const { return socket_file_descriptor_; }  
    void Close () { 
     if (socket_file_descriptor_ != -1) { 
     shutdown (socket_file_descriptor_, SHUT_RDWR); 
     close (socket_file_descriptor_); 
     socket_file_descriptor_ = -1; 
     } 
    } 
    }; 
+0

可能な複製[どのようにして1つのネットワークインターフェイスにのみソケットを動的にバインドするのですか?](http://stackoverflow.com/questions/1119401/how-do-i-dynamically-bind-a-socket-to- only-one-network-interface) –

+0

シナリオに詳細を追加できますか? @SB私は(まだ)それがその質問の重複ではないと確信していません。 – cnicutar

+0

@cnicularこのクラスを使用する方法は、それをインスタンス化してconnectを呼び出すことです。私は自動的に "eth5" NICを使用するようにクラスを変更することを望んでいました。次の変更として、インスタンス化に引数を追加して、ユーザーがどのNICを使用するかを制御できるようにしました。 –

答えて

3

情報によればhere次のようにこれを達成するためsetsockopt()を使用することができます。

char* interface = "eth5"; 
setsockopt(socket_file_descriptor_, SOL_SOCKET, SO_BINDTODEVICE, interface, 4); 

を最後のパラメータ、4、インタフェース変数のバイト数を表します。

+0

最後の引数に4の代わりにsizeof(interface)を使うべきでしょう。 – Avner

関連する問題