linux c++ 多网卡情况下,如何判断原始套接字接收到的是哪个网卡的数据

这篇具有很好参考价值的文章主要介绍了linux c++ 多网卡情况下,如何判断原始套接字接收到的是哪个网卡的数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Linux系统中,使用原始套接字(raw socket)接收网络数据时,可以通过解析IP头部来判断接收到的数据是哪块网卡接收的。这是因为在Linux系统中,每个网卡接收到数据包后,会将数据转发到与之对应的raw套接字。

要判断接收到的数据是哪块网卡接收的,你需要:

创建一个原始套接字并绑定到一个特定的协议。

接收数据并解析IP头部,IP头部中包含接收网卡的信息。

以下是一个简单的示例代码,展示如何在C++中创建一个原始套接字,并解析接收到的IP数据包以确定数据是从哪个网卡来的:

#include <iostream>
#include <cstring>      // for memset
#include <netinet/ip.h> // for IP header
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
 
int main() {
    int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_IP); // 创建原始套接字
    if (sockfd < 0) {
        std::cerr << "Cannot open socket" << std::endl;
        return -1;
    }
 
    // 绑定到所有接口
    const int on = 1;
    if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, &on, sizeof(on)) < 0) {
        std::cerr << "Cannot bind to device" << std::endl;
        close(sockfd);
        return -1;
    }
 
    // 接收数据
    unsigned char buffer[4096];
    sockaddr_in src_addr;
    socklen_t src_len = sizeof(src_addr);
    ssize_t bytes_read;
    while ((bytes_read = recvfrom(sockfd, buffer, sizeof(buffer), 0, (sockaddr*)&src_addr, &src_len)) > 0) {
        // 解析IP头部以确定网卡
        iphdr* ip_hdr = (iphdr*)(buffer + sizeof(sa_family_t)); // sizeof(sa_family_t) is for the address family
        std::cout << "Received packet from interface: " << ip_hdr->ihl << std::endl; // ihl is the header length
        // 处理数据...
    }
 
    close(sockfd);
    return 0;
}

在上面的代码中,ihl字段在IP头部中标识了头部的长度,这通常也可以用来区分不同的网卡。然而,这并不是一个唯一标识网卡的字段,因为ihl可以被伪造。为了更准确地识别网卡,你可以使用系统调用getsockopt来获取接收数据的网卡名称,但这通常需要额外的系统调用和复杂的处理。

请注意,在实际应用中,原始套接字的使用和数据解析需要具备root权限,并且需要小心处理,因为直接接收和处理网络数据可能会影响系统的正常工作。文章来源地址https://www.toymoban.com/news/detail-852949.html

到了这里,关于linux c++ 多网卡情况下,如何判断原始套接字接收到的是哪个网卡的数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [C++ 网络协议] 套接字的多种可选项

    目录 1. 套接字的可选项 2. 获取/设置套接字可选项 2.1 getsockopt函数(获取套接字可选项) 2.2 setsockopt函数(设置套接字可选项) 3. 常用套接字可选项 3.1 SOL_SOCKET协议层的SO_TYPE可选项 3.2 SOL_SOCKET协议层的SO_SNDBUF和SO_RCVBUF可选项 3.3 SOL_SOCKET协议层的SO_REUSEADDR可选项 3.3.1 Time-wait状

    2024年02月11日
    浏览(27)
  • C++网络编程 TCP套接字基础知识,利用TCP套接字实现客户端-服务端通信

    流式套接字编程针对TCP协议通信,即是面向对象的通信,分为服务端和客户端两部分。 1)加载套接字库( 使用函数WSAStartup() ),创建套接字( 使用socket() ) 2)绑定套接字到一个IP地址和一个端口上( 使用函数bind() ) 3)将套接字设置为监听模式等待连接请求( 使用函数

    2024年02月03日
    浏览(55)
  • 【Linux】套接字编程

    目录 套接字 IP + PORT TCP和UDP的介绍 TCP UDP 网络字节序 转换接口 UDP服务器的编写 服务器的初始化  socket bind sockaddr 结构 服务器的运行 数据的收发 业务处理 客户端的编写 运行效果 拓展  🌸首先,我们先思考一个问题, 数据从 A 主机发送到 B 主机是网络通信的最终目的吗 ?

    2024年02月05日
    浏览(43)
  • Linux套接字编程

    在上一篇博客中我们对网络中一些基本概念进行了简单阐述,这一篇博客我们来对套接字编程的内容进行初步了解。 目录 1.引入 2.UDP协议 2.1通信两端流程 2.1.1服务端流程 2.1.2客户端流程 2.2套接字相关操作接口 2.2.1创建套接字 2.2.2为套接字绑定地址信息 2.2.3发送数据 2.2.4接收

    2024年02月02日
    浏览(40)
  • [Linux]套接字通信

    摘于https://subingwen.cn,作者:苏丙榅 侵删 局域网和广域网 局域网:局域网将一定区域内的各种计算机、外部设备和数据库连接起来形成计算机通信的私有网络。 广域网:又称 广域网 、 外网 、 公网 。 是连接不同地区局域网或城域网计算机通信的远程公共网络。 IP(Internet

    2024年02月09日
    浏览(67)
  • Linux程序设计:套接字

    Linux套接字(Socket)是在操作系统中用于进程间通信的机制。 socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到

    2024年01月23日
    浏览(41)
  • 【Linux】TCP套接字编程

    目录 前言 UDP服务器的完善 线程的封装 结构定义 接口实现 环形队列 结构定义 接口实现 加锁 信号量的申请与释放 入队与出队 整体组装  初始化与析构 信息接收线程 消息发送线程 TCP套接字 创建套接字 listen accept 收发操作 客户端的编写 进一步完善 多进程 多线程 总结 上篇

    2024年02月05日
    浏览(37)
  • 【Linux】网络---->套接字编程(TCP)

    TCP的编程流程:大致可以分为五个过程,分别是准备过程、连接建立过程、获取新连接过程、消息收发过程和断开过程。 1.准备过程:服务端和客户端需要创建各自的套接字,除此之外服务端还需要绑定自己的地址信息和进行监听。注意:服务端调用listen函数后,处理监听状

    2024年02月04日
    浏览(61)
  • Linux网络编程(二-套接字)

    目录 一、背景知识 1.1 端口号 1.2 网络字节序 1.3 地址转换函数  二、Socket简介 三、套接字相关的函数  3.1 socket() 3.2 bind() 3.3 connect() 3.4 listen() 3.5 accept()  3.6 read()/recv()/recvfrom() 3.7 send()/sendto()  3.8 close()  四、UPD客服/服务端实验  1.1 端口号 端口号是访问服务器的标识 ,就好像

    2024年01月22日
    浏览(87)
  • 【Linux】网络编程套接字一

    上篇博客由唐僧的例子我们知道: 在IP数据包头部中,有两个IP地址,分别叫做源IP地址,和目的IP地址。 思考一下: 不考虑中间的一系列步骤,两台主机我们光有IP地址就可以完成通信了嘛? 想象一下发qq消息的例子,有了IP地址能够把消息发送到对方的机器上。 但是我们把

    2024年03月26日
    浏览(222)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包