NS-3使用日记

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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章