簡體   English   中英

在特定網絡接口 Linux/Unix 上使用 C++ TCP 客戶端套接字

[英]Using a C++ TCP client socket on a specific network interface Linux/Unix

我有以下代碼,默認情況下連接到接口“eth0”,它是一個 1G 網卡,但我想使用“eth5”連接,它是一個 10G 網卡。

 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;
      }
    }
  };

根據此處的信息,您可以使用setsockopt()來實現此目的,如下所示:

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

最后一個參數 4 表示接口變量中的字節數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM