linux指定网卡转发socket,linux下socket指定网卡

系统中存在两个网卡,如何根据socket号知道哪个连接(tcp)在哪个网卡上? 根据getpeername好像有点行不通。或者通过SIOCGARP?netlink?

将问题进行分解,分为主动方式和被动方式两种。主动方式即是系统调用socket创建接口得到的socket号,被动方式即是通过类似accept得到的socket号。

主动方式创建之后,可以利用setsockopt的

SO_BINDTODEVICE。

在socket(7)中对该套接口选项的说明如下:

SO_BINDTODEVICE

Bind this socket to a particular device like "eth0", as specified in the passed interface name. If the name is an empty string or the option length is zero, the socket  device  binding is  removed. The passed option is a variable-length null terminated interface name string with the maximum size  of  IFNAMSIZ. If a socket is bound to an interface, only packets received from that particular interface are processed by the socket. Note that this  only  works  for  some  socket types, particularly AF_INET sockets. It is not supported  for  packet  sockets  (use  normal bind(8) there).

strncpy(interface.ifr_ifrn.ifrn_name, "eth0", \

strlen("eth0"));

if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, \

(char *)&interface, sizeof(interface)) 0) {

perror("SO_BINDTODEVICE failed");

/* Deal with error... */

}

对被动方式的socket,如何区分?一种方法是获得MAC与socket的映射关系,进一步确定是哪个网卡对应的哪些socket。

一段代码:

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#ifdef SOLARIS

#include 

#endif

#define MAXINTERFACES 16

main (argc, argv)

register int argc;

register char *argv[];

{

register int fd, intrface, retn = 0;

struct ifreq buf[MAXINTERFACES];

struct arpreq arp;

struct ifconf ifc;

if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) >= 0)

{

ifc.ifc_len = sizeof buf;

ifc.ifc_buf = (caddr_t) buf;

if (!ioctl (fd, SIOCGIFCONF, (char *) &ifc))

{//获取接口信息

intrface = ifc.ifc_len / sizeof (struct ifreq);

printf("interface num is intrface=%d\n\n\n",intrface);//根据借口信息循环获取设备IP和MAC地址

while (intrface-- > 0)

{//获取设备名称

printf ("net device %s\n", buf[intrface].ifr_name);//判断网卡类型

if (!(ioctl (fd, SIOCGIFFLAGS, (char *) &buf[intrface])))

{

if (buf[intrface].ifr_flags & IFF_PROMISC)

{

puts ("the interface is PROMISC" );

retn++;

}

}

else

{

char str[256];

sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name);

perror (str);

}//判断网卡状态

if (buf[intrface].ifr_flags & IFF_UP)

{

puts("the interface status is UP" );

}

else

{

puts("the interface status is DOWN" );

}//获取当前网卡的IP地址

if (!(ioctl (fd, SIOCGIFADDR, (char *) &buf[intrface])))

{

puts ("IP address is:" );

puts(inet_ntoa(((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr));

puts("" );//puts (buf[intrface].ifr_addr.sa_data);

}

else

{

char str[256];

sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name);

perror (str);

}

/* this section can't get Hardware Address,I don't know whether the reason is module driver*/

#ifdef SOLARIS//获取MAC地址

arp.arp_pa.sa_family = AF_INET;

arp.arp_ha.sa_family = AF_INET;

((struct sockaddr_in*)&arp.arp_pa)->sin_addr.s_addr=((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr.s_addr;

if (!(ioctl (fd, SIOCGARP, (char *) &arp)))

{

puts ("HW address is:" );//以十六进制显示MAC地址

printf("%02x:%02x:%02x:%02x:%02x:%02x\n",

(unsigned char)arp.arp_ha.sa_data[0],

(unsigned char)arp.arp_ha.sa_data[1],

(unsigned char)arp.arp_ha.sa_data[2],

(unsigned char)arp.arp_ha.sa_data[3],

(unsigned char)arp.arp_ha.sa_data[4],

(unsigned char)arp.arp_ha.sa_data[5]);

puts("" );

puts("" );

}

#else

#if 0

/*Get HW ADDRESS of the net card */

if (!(ioctl (fd, SIOCGENADDR, (char *) &buf[intrface])))

{

puts ("HW address is:" );

printf("%02x:%02x:%02x:%02x:%02x:%02x\n",

(unsigned char)buf[intrface].ifr_enaddr[0],

(unsigned char)buf[intrface].ifr_enaddr[1],

(unsigned char)buf[intrface].ifr_enaddr[2],

(unsigned char)buf[intrface].ifr_enaddr[3],

(unsigned char)buf[intrface].ifr_enaddr[4],

(unsigned char)buf[intrface].ifr_enaddr[5]);

puts("" );

puts("" );

}

#endif

if (!(ioctl (fd, SIOCGIFHWADDR, (char *) &buf[intrface])))

{

puts ("HW address is:" );

printf("%02x:%02x:%02x:%02x:%02x:%02x\n",

(unsigned char)buf[intrface].ifr_hwaddr.sa_data[0],

(unsigned char)buf[intrface].ifr_hwaddr.sa_data[1],

(unsigned char)buf[intrface].ifr_hwaddr.sa_data[2],

(unsigned char)buf[intrface].ifr_hwaddr.sa_data[3],

(unsigned char)buf[intrface].ifr_hwaddr.sa_data[4],

(unsigned char)buf[intrface].ifr_hwaddr.sa_data[5]);

puts("" );

puts("" );

}

#endif

else

{

char str[256];

sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name);

perror (str);

}

}//while

} else

perror ("cpm: ioctl" );

} else

perror ("cpm: socket" );

close (fd);

return retn;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux网卡指的是在一台Linux服务器上同使用两个网卡进行网络连接。通过配置双网卡,可以实现网络负载均衡、网络冗余和网络隔离等功能。 在Linux系统中,可以使用ifconfig命令查看和设置网卡信息。首先,通过ifconfig命令查看当前系统中存在的网卡接口,然后通过配置文件修改网络接口的配置信息,使得两个网卡工作。 在C程序中,可以使用socket函数创建UDP套接字,然后使用bind函数将套接字绑定到一个特定的本地IP地址和端口号上。接着,使用recvfrom函数从UDP套接字中接收数据报文,并使用sendto函数将数据报文发送指定的目标IP地址和端口号。 在实际应用中,可以使用两个UDP套接字分别监听两个网卡的IP地址和端口号,以实现双网卡的功能。通过套接字的接收和发送函数,可以在不同的网卡上接收和发送数据报文。 另外,还可以通过设置套接字的选项,如SO_REUSEADDR和SO_BINDTODEVICE等,来实现更精细的控制。 综上所述,Linux网卡和C语言的socket编程可以结合使用,通过配置双网卡实现网络负载均衡和网络隔离等功能,并使用UDP套接字进行数据的接收和发送。 ### 回答2: Linux网卡C语言Socket UDP是指在Linux系统下,基于C语言编程,使用Socket和UDP协议进行网络通信的双网卡配置。 网卡是计算机连接网络的一种硬件设备,有我们需要使用多个网卡来实现更高效的网络通信。在Linux系统中,我们可以通过配置双网卡来实现此目的。 使用C语言编程,我们可以使用Socket库函数来进行网络通信。Socket是一种能够在不同计算机之间进行通信的API接口,可以用于UDP、TCP等网络协议。 UDP是用户数据报协议,它是一种无连接的、不可靠的传输协议,适用于一对一或多对一的通信。UDP在传输数据效率高,但无法保证数据的可靠性和顺序性。 在双网卡配置中,我们可以使用C语言编写程序,通过Socket和UDP协议进行通信。首先,我们需要调用Socket函数创建一个套接字,并使用bind函数将套接字绑定到一个特定的IP地址和端口号上。然后,我们可以使用recvfrom函数接收来自其他计算机的数据,并使用sendto函数将数据发送给其他计算机。 通过配置两个不同的网卡,我们可以利用双网卡进行双向通信。例如,我们可以将一个网卡连接到局域网,另一个网卡连接到互联网,这样就可以实现局域网和互联网之间的数据传输。 总之,Linux网卡C语言Socket UDP是指在Linux系统下,利用C语言编程,通过Socket库函数和UDP协议进行双网卡配置和网络通信的技术。这种技术可以实现高效的双向数据传输,并适用于一对一或多对一的通信场景。 ### 回答3: Linux网卡 c socket UDP 是指在 Linux 操作系统中,使用 C 编程语言编写的程序,通过 Socket 编程接口,使用 UDP 协议进行网络通信。 双网卡是指计算机系统中同安装了两块或多块网卡,通过这些网卡可以连接到不同的网络。在使用双网卡的情况下,我们可以在程序中指定使用哪一块网卡进行数据传输,实现数据的接收和发送。在使用双网卡的环境下,程序可以同监听多个网络上的数据包,并且可以选择性地进行数据的处理。 Socket 是一种网络编程的接口,是一种软件接口,用于支持进程间的网络通信。在 C 语言中,我们使用 Socket 编程接口来创建网络连接,发送和接收数据。通过 Socket 编程接口,我们可以轻松地实现各种网络通信方式,包括 TCP、UDP 以及其他协议。 UDP 是用户数据报协议(User Datagram Protocol)的缩写,它是一种无连接的、不可靠的传输协议。与 TCP 不同,UDP 不需要在传输之前建立连接,直接将数据通过 UDP 数据包发送给目标主机。由于 UDP 无连接且不可靠,所以它的传输速度比 TCP 快,但是在传输过程中可能会出现数据丢失或者乱序的问题。在使用 UDP 进行网络通信,我们需要使用程序来处理这些问题,确保数据的可靠性。 总结来说,Linux网卡 C Socket UDP 是指在 Linux 操作系统中,通过 C 编程语言编写的程序,使用 Socket 编程接口,利用 UDP 协议进行网络通信。在双网卡环境下,程序可以指定使用哪一块网卡进行数据传输,并且可以实现数据的接收和发送。同,程序也需要处理 UDP 协议带来的数据丢失或者乱序等问题,确保数据的可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值