天天看點

NS-3使用日記<一>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;
           

繼續閱讀