【发布时间】:2013-12-19 13:31:24
【问题描述】:
我正在使用 Linux(Debian) 和 C。
我已经打开了接口的套接字 - eth0 和 eth1 具有以下功能:
// Opening the socket
mSocket = socket(device->ifa_addr->sa_family, SOCK_RAW | SOCK_NONBLOCK,
htons(ETH_P_ALL));
if (mSocket == -1)
{
throw CException("socket is bad");
}
// Adding flag to the socket to work only on a specific interface
if (setsockopt(mSocket, SOL_SOCKET, SO_BINDTODEVICE,
(void *) &mIfreq, sizeof(mIfreq)) < 0)
{
throw CException(
"Failed to add binding to specific interface flag");
}
ifreq 持有接口名称:
strncpy(mIfreq.ifr_ifrn.ifrn_name,device->ifa_name, IF_NAMESIZE);
接下来我使用以下代码接收数据包:
recvSize = recvfrom(mSocket, buffer, ETH_FRAME_LEN, 0, NULL,
NULL);
问题:
1)为什么如果两个接口都没有连接到任何非套接字可以打开的东西
2*) 如果 eth0 已连接而 eth1 未连接,为什么 (WLOG) 我可以打开每个套接字的套接字
2.1*) 为什么通过从 eth1 套接字读取我得到了在 eth0 中接收到的所有数据包
(eth1 上的wireshark 没有显示任何应有的数据包)
[我的猜测 - 是 linux 的错吗?(在我背后做事?)]
提前致谢,
绝望
【问题讨论】:
-
mIfreq包含什么?它是如何定义的? -
throw CException(...)和使用 C 是如何结合在一起的? -
ifreq 仅使用 ETH0/1 名称初始化。
-
@glglgl 如果我将 C 库与 C++ 异常库一起使用会有所不同吗?在这里学习,谢谢!
-
@Despair 这有什么帮助?你没有办法抛出异常。
标签: c linux sockets interface packet