NS-3使用日记<一>

本文记录了在NS-3实验中尝试将SDN.cc配置流程化时遇到的问题,主要探讨如何在回调函数中传递自定义参数以区分不同源。通过研究Callback机制,发现无法直接控制回调函数的输入,尝试添加Tag或Attribute未果。最终通过修改Connect方法和利用socket获取信息解决了问题,详细解释了如何从socket中获取关联节点ID避免错误。

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

NS-3使用日记<一>

最近做实验,感觉还是要把实验中遇到的问题写下来,好记性不如烂笔头嘛。方便自己查阅,也方便别人参考。毕竟老师说了,SDN现在这个实验是要做九代单传的了。

今天主要是想把SDN.cc的配置变得更加流程化、懒人化,毕竟一下子要操作12个流,一个个写socket都要写死人了。这次遇到的问题是,怎么在callback的时候传入自己的参数,毕竟这样才能分辨出是哪辆Source发的。

首先是理解了Callback。就是高层应用调用底层库函数再调用高层函数的一个做法。参考。我很快就发现,这个回调函数是跟一个路径上的文件绑在一起的……Config::ConnectWithoutcontect (temp1,MakeCallback(&VanetSim::TXTraces, this));其中this是指该实例下的TXTraces函数。这意味着我没法控制文件上的输出,也就没法控制回调函数的输入了。后来我又想往packet里面加Tag或者Attribute,发现要自己实现具体的序列化和解序列化的过程,很麻烦。Attribute的本质好像是压在data里的,而Tag好像是和data独立存的。无一例外都要自己定义内容。

后来TXTraces是通过改成Connect,来解决的。这样回调函数会多收一个参数string path,对应绑定的那个path,里面有车的id。

而recvdatapacket的回调则通过socket,因为回调函数收到的是一个socket参数。一开始调用的是socket里的fromaddress,后来想起来ns3的发包端口是随机的,这里面是49315好像,所以根本从发包端口分辨不出来。后来发现socket里面直接可以拿到node的信息,不过这个node是associated with的node,它的id没有意义,还可能因为statistics[num]里根本还没有num个对象(比如num=1的时候,statistics只有一个对象,却要求找num=3的内容,这就会出现hash_table相关的段错误。必须找到connected with的node或者associated with的address才可以,这时候,GetSockName就显得温柔可爱了……

    Ptr<Packet> packet;
    Address from;
    while ((packet = socket->RecvFrom (from)))
    {
        uint64_t uid = packet->GetUid();
        InetSocketAddress address = InetSocketAddress::ConvertFrom (from);
        //no udheader
        int num= address.GetPort() - base_port;
    Ptr<Node> node;
    node = socket->GetNode();

    //no udheader
    int num= node->GetId() - (nodeNum+numofLC);
        Address to;
        socket->GetSockName(to);
        InetSocketAddress address = InetSocketAddress::ConvertFrom (to);
        int num= address.GetPort() - base_port;
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.3" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_3.xsd"> <display-name>Archetype Created Web Application</display-name> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> <!-- 配置spring资源 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:application.xml</param-value> </context-param> <!-- 乱码问题 --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--配置springmvc DispatcherServlet接收到的http请求通过DispatcherServlet进行分发。--> <servlet> <servlet-name>note</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!--Sources标注的文件夹下需要新建个spring文件夹--> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>note</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>检查代码修改正确
最新发布
06-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值