为TCPClient连接选择特定的以太网设备

时间:2012-04-29 11:39:59

标签: c++ c sockets

我目前正在使用套接字编程,但在使用多个以太网设备的计算机上测试代码时,我在连接设备时遇到问题。

如何定义应使用哪个以太网设备(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);
}

提前致谢。

2 个答案:

答案 0 :(得分:3)

您可以使用bind功能指定收听地址。

0.0.0.0的地址用于侦听属于该计算机的所有接口和IP地址,或者您可以指定要侦听的特定IP地址,这将仅选择该地址所属的接口

编辑:页面底部的MSDN示例更容易理解

答案 1 :(得分:2)

TCP连接有两个相同的端点,一旦建立就无法区分。 两端都有一个IP地址和一个端口号,另一台计算机必须将数据发送到。

connect函数告诉客户端服务器正在侦听的IP地址和端口

bind函数告诉客户端它应该监听哪个IP地址和端口用于来自服务器的回复。如果您不致电bind(),操作系统将自动选择合适的值。

您遇到的问题(来自您所说的)是操作系统选择了错误的默认IP地址。这是绑定功能的用武之地。

以下是代码的(未经测试的)修正副本,该副本绑定到192.168.100.2的地址。您需要将其更改为属于您要使用的接口的地址。

如果您打开终端并输入ifconfig -a,它将打印所有接口的列表以及属于每个接口的IP地址。您应该使用属于您要使用的接口的IP地址替换以下代码中的值192.168.100.2

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);
}