记一个原始套接字不能在同一网段发包的问题

本文探讨了使用原始套接字发送自定义IP包时遇到的问题。当IP包源地址与本地地址相同时,发送到同一网段会失败。通过调整发送地址解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    最近编写一个原始套接字程序,自己构造IP包发送给对方,TCP和IP的校验和都计算正确了。测试的时候发现发送到不同网段成功,但是发送到同一网段却不行。
    发送的代码大约是这样的:
void Send(IP_HEADER* ip)
{
    
int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    assert(sock
>0);
    
int nValue = 1;
    setsockopt(sock, IPPROTO_IP, IP_HDRINCL, 
&nValue, sizeof(nValue));
    
struct sockaddr_in addr;
    memset(
&addr, 0sizeof(struct sockaddr_in));
    addr.sin_family 
= AF_INET;
    addr.sin_addr.s_addr 
= ip->SrcIP;
    sendto(sock, (
void*)ip, ntohs(ip->Length), 0,
            (
struct sockaddr *)&addr, sizeof(struct sockaddr_in));
    close(sock);
    sock 
= 0;
}

   后来发现,问题出在发送出去的IP与IP包的IP一致的时候,发送到同一网段就会失败。
    将addr.sin_addr.s_addr = ip->SrcIP;修改成:addr.sin_addr.s_addr = inet_addr("1.1.1.1");后,同一网段也能发送成功了。

    呵呵,看来还没摸到原始套接字的脾气!
博客地址:https://blog.youkuaiyun.com/weixin_41749063/article/details/104023987 摘要: ## 1.简介 其实Qt网络模块中自带的[QTcpsocket](https://doc.qt.io/archives/qt-5.6/qtcpsocket.html)已经封装的很好了,避免了用原始套接字编程繁琐的过程,不过大部分应用场景我们希望将收发数据 运行在一个单独的线程,不阻塞界面或其他线程。所以结合Qt自带的QThread类 简单的封装了一下QTcpsocket,使其工作 在单独线程,并加入了心跳和断线重连机制。 ## 2.EasyClient类说明 由于接触QT时间不是很长,所以写的不是很好,可能里边也有Bug,不过觉得这个思路应该是可行的。封装的比较简单,若有问题完全可以自己改改。主要提供一个思路就是的将一个继承自QObject的子类转移到一个线程,使其在这个线程里进行事件循环,开一个定时器用于发送心跳和重连。 经过采坑发现,定时器的开和关需放在实例化EasyClient子类的那个线程(下面称之为主线程),不能在事件循环线程中(下面称之为子线程中)否则会有错。实例化QTcpsock需要在 子线程中进行,否则会出现无法正常通信的现象。 使用时只需要实例化一个EasyClient的子类,重写SendHeartBeat()和DisPoseReceiveData()两个纯虚函数,SendHeartBeat()决定发什么内容作为心跳指令,当有数据可读时会全部读入,只需要在DisPoseReceiveData()做处理即可。.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值