發表文章

目前顯示的是 5月, 2016的文章

BCB: unimplement export template 分離編譯樣板失敗

圖片
BCB的Help裡面擺明了就是不支援export template的功能。 假設我寫了一段樣板的程式碼如下: template T** NEW(const int height, const int width) { T** array = NULL; if (height>0 && width>0) { array = new T*[height]; if (array != NULL) { for (int j = 0 ; j < height ; ++j) array[j] = new T[width]; } else { delete[] array; array = NULL; } } return array; 我在BCB中就不能只在.h(即標頭檔)中寫這個樣板函數的原型(prototype),將上面的程式碼放到.cpp裡面進行編譯。編譯時只會得到Link Error Unresolved External,從以前學過的系統程式課程來看,export template應該是需要編譯器支援額外的處理,將模板的型態額外資訊輸出的到OBJ中,並且Linker也要進行這些額外資訊的處理。

基本SOCKET操作範例

本週末在複習基本的socket操作,並在Ubuntu 14.04.4上編譯完成, 程式碼和執行檔都已經放在github上,有需要請自由取用! https://github.com/Mirochiu/socket_practice 包含三個部分 socket_file  用socket file為媒介傳送封包 socket_inet 用socket傳送網路TCP封包 socket_udp 用socket傳送網路UDP封包 file的部分 只是看範例寫寫看,參考就好。這個方法的socket系統會依照指定名稱建立一個socket file,藉此讓兩者溝通。不正常結束程式時,系統不會自動刪除該socket檔案,就會造成下次啟動程式的一些問題,所以一般會先刪除(unlink)掉之前使用的socket檔案。 在inet的部分 有client和server可以做連線傳封包,不過用法是有些錯誤的。這些錯誤在client2和server2把它修正了,修正的部分是endian在探討。 電腦記憶體的byte-order架構,在x86電腦上是用little,但是網路協定是用big-endian,如果ip/port設定不經過轉換,你就會發現程式無法跟網路上的其他電腦溝通。showlisten.sh就是用來顯示Ubuntu中實際程式有開了哪個port。(記得使用時要給它執行權限) 另外寫了getifaces, getifaceinfo, getipbyname則是顯示電腦上的全部網路卡、顯示網路卡目前的IP, MAC, Netmask資訊、網站名稱(例如:www.google.com)與實際上主機IP查詢功能。 在udp的部分 包含sender和reciver可以做UDP封包的傳接,這裡使用的是unconnect udp socket,sender是固定500毫秒送一些資料出去。這部分為了只關注UDP的封包,在socket建立時就指定protocol為UDP。不過得記得要接收資料還是需要用bind將socket綁訂在本機的特定port上,然後傳送資料要使用,並且傳送資料接收資料應該換成 recvfrom和sendto而不再是read和write。 udpp2p的部分,是將port獲得的upd封包內容,經由另一個port送出去,也就是轉por