C++ 使用C++;特定网络接口Linux/Unix上的TCP客户端套接字

C++ 使用C++;特定网络接口Linux/Unix上的TCP客户端套接字,c++,sockets,tcp,network-programming,C++,Sockets,Tcp,Network Programming,我有以下代码,默认情况下连接到接口“eth0”,这是一个1G NIC,但我想使用“eth5”,这是一个10G NIC进行连接 class TCPClientSocket { protected: int socket_file_descriptor_; public: TCPClientSocket ( ) : socket_file_descriptor_ ( -1 ) { /* socket creation */

我有以下代码,默认情况下连接到接口“eth0”,这是一个1G NIC,但我想使用“eth5”,这是一个10G NIC进行连接

 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;
      }
    }
  };
TCPClientSocket类{
受保护的:
int套接字文件描述符;
公众:
TCPClientSocket()
:套接字文件描述符(-1)
{
/*套接字创建*/
socket\u文件\u描述符=socket(AF\u INET,SOCK\u STREAM,0);
if(套接字文件描述符){exit(1)}
}
无效连接(const std::string&_ors_ip_,const int_ors_port_){
ors\u Addr\u中的结构sockaddr\u;
bzero(&ors_Addr_,sizeof(ors_Addr_));
ors_Addr_.sin_family=AF_INET;
ors_Addr_u.sin_port=htons(_ors_port_u);
地址(AF_inet,_ors_ip_.c_str(),&(ors_Addr_.sin_Addr));
if(connect(socket\u文件\u描述符(struct sockaddr*)和ors\u Addr\u,sizeof(struct sockaddr\u in))<0{
fprintf(stderr,“连接()在%s上失败:%d\n”,\u ors\u ip\u.c\u str(),\u ors\u port\u);
关闭(套接字文件描述符);
套接字\文件\描述符\ 1;
}
}
内联整数写入(常量无符号整数_len),常量无效*_src)常量{
if(套接字文件描述符)=-1){
返回写入(套接字、文件、描述符、src、len);
}
返回-1;
}
内联整数读取(常量无符号整数_len,void*_dest)常量{
if(套接字文件描述符)=-1){
返回读取(套接字、文件、描述符、目的地、长度);
}
返回-1;
}
内联bool IsOpen()常量{return(套接字文件描述符{-1)}
内联int套接字文件描述符()常量{返回套接字文件描述符}
无效关闭(){
if(套接字文件描述符)=-1){
关闭(套接字\文件\描述符\关闭\ RDWR);
关闭(套接字文件描述符);
套接字\文件\描述符\ 1;
}
}
};

根据信息,您可以使用
setsockopt()
实现以下目的:

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

最后一个参数4表示接口变量中的字节数。

可能重复的。您能为场景添加更多详细信息吗@SB我(还)不确定它是否是那个问题的重复。@c我们使用这个类的方式就是实例化它并调用connect。我希望改变这个类,让它自动使用“eth5”网卡。作为下一个更改,我们将在实例化中添加一个参数,允许用户控制要使用的NIC。出于兴趣,为什么不在应用程序外部使用接口上的度量来解决它?@awoodland我不理解“接口上的度量”?可能应该使用sizeof(接口)而不是最后一个论点的4。