为 TCP 连接选择特定的以太网设备
Choosing a specific ethernet device for TCPClient connection
我目前正在使用套接字编程,但是在具有多个以太网设备的计算机上测试代码时,我在连接到我的设备时遇到问题。
如何定义它应该使用哪个以太网设备 (Mac OS X(?
源:
int sock, bytes_recieved;
char send_data[1024],recv_data[1024];
struct hostent *host;
struct sockaddr_in server_addr;
host = gethostbyname("192.168.100.4");
cout << "Start" << endl;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
// perror("Socket");
cout << "Socket error" << endl;
exit(1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(30002);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(server_addr.sin_zero),8);
if (connect(sock, (struct sockaddr *)&server_addr,
sizeof(struct sockaddr)) == -1)
{
// perror("Connect");
cout << "Connect error" << endl;
exit(1);
}
提前谢谢。
您可以使用 bind 函数指定侦听地址。
地址 0.0.0.0 用于侦听属于计算机的所有接口和 IP 地址,或者您可以指定要侦听的特定 IP 地址,这将仅选择该地址所属的接口
编辑:页面底部的MSDN示例更容易理解
TCP 连接有 2 个相同的末端,一旦建立就无法区分。两端都有一个 IP 地址和一个端口号,另一台计算机必须将数据发送到这些地址和端口号。
connect
函数告诉客户端服务器正在侦听的 IP 地址和端口
bind
函数告诉客户端它应该侦听来自服务器的回复的 IP 地址和端口。如果不调用bind()
操作系统将自动选择合适的值。
遇到的问题(从您所说的(是操作系统选择了错误的默认 IP 地址。这就是绑定函数的用武之地。
下面是一个(未经测试的(代码的固定副本,它绑定到192.168.100.2
的地址。您需要将其更改为属于您要使用的接口的地址。
如果打开终端并输入ifconfig -a
它将打印所有接口的列表以及属于每个接口的 IP 地址。应将以下代码中的值192.168.100.2
替换为属于要使用的接口的 IP 地址。
int sock, bytes_recieved;
char send_data[1024],recv_data[1024];
struct hostent *host;
struct sockaddr_in server_addr, local_addr; //Added a new variable in here for our local address
host = gethostbyname("192.168.100.4"); //This is the address of the server we are connecting to
cout << "Start" << endl;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
// perror("Socket");
cout << "Socket error" << endl;
exit(1);
}
//Now we want to bind an IP address
//This is an IP address that belongs to your computer, that will be used as the reply IP address
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = inet_addr("192.168.100.2"); //CHANGE THIS: this is an address on your computer
local_addr.sin_port = htons(0); //Leave this as 0 and the operating system will choose a unused one for you
if bind(sock, (struct sockaddr *)&local_addr, sizeof(local_addr)) == -1)
{
// perror("Bind");
cout << "Bind error" << endl;
exit(1);
}
//Set up the structure that tells us what server to connect to
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(30002);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(server_addr.sin_zero),8);
//And connect to the server
if (connect(sock, (struct sockaddr *)&server_addr,
sizeof(struct sockaddr)) == -1)
{
// perror("Connect");
cout << "Connect error" << endl;
exit(1);
}
相关文章:
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- 通过TCP的PvP通信问题
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- AWS IoT 开发工具包:通过 TCP 端口 443 使用 MQTT
- 计算出有多少客户端可以连接到我正在使用的一些tcp服务器代码
- 动态获取 esp32 的 mac 地址并在以太网库中使用它.
- 通过单独的 tcp 流建立 http 连接
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 读取 TCP 标头并使用RAW_SOCKET管理 TCP 连接
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- grpc 的 ServerBuilder::AddListeningPort() 总是返回 TCP 端口零
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 通过TCP连接到Wi-Fi上的0.0.0.0,而侦听器PC有活动的Wi-Fi,以太网没有'不起作用
- 为 TCP 连接选择特定的以太网设备
- 重定向USB数据到以太网/TCP/IP端口
- 通过TCP/IP以太网发送数字数据