【发布时间】:2011-08-14 14:49:32
【问题描述】:
我有以下代码默认连接到接口“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;
}
}
};
【问题讨论】:
-
您能在场景中添加更多细节吗? @SB我(还)不确定它是那个问题的重复。
-
@cnicular 我们使用这个类的方式就是实例化它并调用connect。我希望只是更改类,以便它自动使用“eth5”网卡。作为下一个更改,我们将在实例化中添加一个参数,该参数允许用户控制要使用的 NIC。
-
出于兴趣,为什么不在应用程序之外通过接口上的度量来解决它?
-
@awoodland 我不明白“接口上的指标”?
标签: c++ sockets tcp network-programming