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