T**S 发帖数: 319 | 1 【 以下文字转载自 Programming 讨论区 】
发信人: TINS (TINS), 信区: Programming
标 题: Re: 有没有什么网络函数能够 (转载)
发信站: BBS 未名空间站 (Thu Sep 30 23:31:56 2010, 美东)
不是的. 比如说你的机器上有两个网卡, 各有一个地址. 现在如果你要送数据到, 比如
www.google.com, 那么你发出来的数据将使用那个本地地址作为source address呢? IP
header中的一些field, 是由系统自动设定的. 当然有些field可以通过setsockopt()
来设置或getsockopt()来查询, 但souorce IP是系统根据routing table中的路由来设
置的. 现在的问题就是如何能知道到底系统选择的是哪个本地地址.
机器上可能有多个网卡, 而且每个都可能有许多IP aliases, routing table 也可能很
复杂, 所以才有这个问题. | j*a 发帖数: 14423 | 2 strace ip add
IP
【在 T**S 的大作中提到】 : 【 以下文字转载自 Programming 讨论区 】 : 发信人: TINS (TINS), 信区: Programming : 标 题: Re: 有没有什么网络函数能够 (转载) : 发信站: BBS 未名空间站 (Thu Sep 30 23:31:56 2010, 美东) : 不是的. 比如说你的机器上有两个网卡, 各有一个地址. 现在如果你要送数据到, 比如 : www.google.com, 那么你发出来的数据将使用那个本地地址作为source address呢? IP : header中的一些field, 是由系统自动设定的. 当然有些field可以通过setsockopt() : 来设置或getsockopt()来查询, 但souorce IP是系统根据routing table中的路由来设 : 置的. 现在的问题就是如何能知道到底系统选择的是哪个本地地址. : 机器上可能有多个网卡, 而且每个都可能有许多IP aliases, routing table 也可能很
| a9 发帖数: 21638 | 3 连接的属性里应该有吧?
你看看mono里Socket里有个GetLocalIPEndpoint的代码,他们是怎么获取的,呵呆。
IP
【在 T**S 的大作中提到】 : 【 以下文字转载自 Programming 讨论区 】 : 发信人: TINS (TINS), 信区: Programming : 标 题: Re: 有没有什么网络函数能够 (转载) : 发信站: BBS 未名空间站 (Thu Sep 30 23:31:56 2010, 美东) : 不是的. 比如说你的机器上有两个网卡, 各有一个地址. 现在如果你要送数据到, 比如 : www.google.com, 那么你发出来的数据将使用那个本地地址作为source address呢? IP : header中的一些field, 是由系统自动设定的. 当然有些field可以通过setsockopt() : 来设置或getsockopt()来查询, 但souorce IP是系统根据routing table中的路由来设 : 置的. 现在的问题就是如何能知道到底系统选择的是哪个本地地址. : 机器上可能有多个网卡, 而且每个都可能有许多IP aliases, routing table 也可能很
| s****n 发帖数: 786 | 4 struct ifreq ifreq;
int sock;
if((sock=socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
return -1;
}
strcpy(ifreq.ifr_name,"eth1"); //change your interface here
if(ioctl(sock,SIOCGIFHWADDR,&ifreq)<0) //get your network address here
{
perror("ioctl");
return -1;
} | T**S 发帖数: 319 | 5 the problem is you don't know which interface the packet will use to send
out. you may have eth0, eth1, eth0:10, eth2:1, etc., in your system, and it
is the rotuting table decide the correct one.
also getsockname() or getpeername() doesn't apply either.
【在 s****n 的大作中提到】 : struct ifreq ifreq; : int sock; : if((sock=socket(AF_INET,SOCK_STREAM,0))<0) : { : perror("socket"); : return -1; : } : strcpy(ifreq.ifr_name,"eth1"); //change your interface here : if(ioctl(sock,SIOCGIFHWADDR,&ifreq)<0) //get your network address here : {
| y***d 发帖数: 2330 | 6 strace ifconfig
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
ioctl(4, SIOCGIFCONF, {80, {{"lo", {AF_INET, inet_addr("127.0.0.1")}}, {"
eth0", {AF_INET, inet_addr("xxx.xxx.xxx.xxx")}}}}) = 0
it
【在 T**S 的大作中提到】 : the problem is you don't know which interface the packet will use to send : out. you may have eth0, eth1, eth0:10, eth2:1, etc., in your system, and it : is the rotuting table decide the correct one. : also getsockname() or getpeername() doesn't apply either.
| a9 发帖数: 21638 | 7 getsockname不是就是获取本地地址的吗?
it
here
【在 T**S 的大作中提到】 : the problem is you don't know which interface the packet will use to send : out. you may have eth0, eth1, eth0:10, eth2:1, etc., in your system, and it : is the rotuting table decide the correct one. : also getsockname() or getpeername() doesn't apply either.
| s****n 发帖数: 786 | 8 The routing table still has to ask the kernel to find the outgoing interface.
Check the Linux Device Driver and you will know the details.
it
【在 T**S 的大作中提到】 : the problem is you don't know which interface the packet will use to send : out. you may have eth0, eth1, eth0:10, eth2:1, etc., in your system, and it : is the rotuting table decide the correct one. : also getsockname() or getpeername() doesn't apply either.
| d*********8 发帖数: 2192 | 9 同问。TCP握手开始之后,getsockname() 还不知道本地IP/PORT? 神奇了。
【在 a9 的大作中提到】 : getsockname不是就是获取本地地址的吗? : : it : here
| T**S 发帖数: 319 | 10 问题是可能根本就没有连接,就是想知道__如果__要送到一个地址,那么发出的数据的
source ip是什么?不管是tcp或udp等。
【在 d*********8 的大作中提到】 : 同问。TCP握手开始之后,getsockname() 还不知道本地IP/PORT? 神奇了。
| d*********8 发帖数: 2192 | 11 OK
楼主的问题是,有没有api可以知道本机的路由和防火墙结果。
试试 Netlink 吧。 |
|