使用c++ TCP客户端套接字在特定的网络接口Linux/Unix
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:%dn", _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表示接口变量的字节数
相关文章:
- 如何绑定 C++ gRPC 客户端的网络接口
- C/C++:POSIX 兼容方式查找默认网络接口上/下
- 如何以编程方式将路由添加到网络接口
- 检测网络接口更改
- 使用 Boost.Asio 将 UDP 套接字绑定到特定网络接口
- 如何在非网关接口 Linux 上检测互联网连接
- 用于修改网络接口属性的 Win32 API
- 如何使用Qt在Windows上检查网络接口类型是以太网或无线
- 实现现有的网络接口,以相对于C 11中的Endianess定义位字段
- 网络接口的状态
- getifaddrs 是否给我重复的网络接口地址
- C++获取网络接口信息
- 如何在 Linux 的 cpp 中查找侦听 0.0.0.0 的服务器的网络接口
- 如何设置IP到网络接口
- 通过WinAPI禁用/启用网络接口
- 从IPv4地址获取网络接口名称
- curl—是否有办法强制curl使用特定的网络接口?
- 查找C/ c++中可用的网络接口
- 如何在linux中找到默认的网络接口
- 使用c++ TCP客户端套接字在特定的网络接口Linux/Unix