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;
}
}
};
可能な複製[どのようにして1つのネットワークインターフェイスにのみソケットを動的にバインドするのですか?](http://stackoverflow.com/questions/1119401/how-do-i-dynamically-bind-a-socket-to- only-one-network-interface) –
シナリオに詳細を追加できますか? @SB私は(まだ)それがその質問の重複ではないと確信していません。 – cnicutar
@cnicularこのクラスを使用する方法は、それをインスタンス化してconnectを呼び出すことです。私は自動的に "eth5" NICを使用するようにクラスを変更することを望んでいました。次の変更として、インスタンス化に引数を追加して、ユーザーがどのNICを使用するかを制御できるようにしました。 –