UTips. 49: ekee

UTips. 48: Mono

  • Mono
  • 在Linux底下想要編譯c#的程式碼可以透過Mono這個套件來完成。

    • sudo apt-get install mono-gmcs monodevelope

    以下是一個簡單到不行的c#的程式碼。

    /************ csharp.cs ******************/

    class csharp{

    public static void Main(string[] args){

    System.Console.WriteLine("Hello! I'm C#\n");

    }

    }

    /*****************************************/

    你可以透過下面的方式來編譯。

    • gmcs csharp.cs

    編譯完後會出現一個叫做csharp.exe的程式,我們必須透過mono來執行。

    • mono csharp.exe

    如此你就能在Linux底下編譯執行一些小的c#專案,當然程式語言有那麼多種,有沒有必要在Linux底下還使用c#,就看你的需求而定了。

[C/C++] Socket Programming: Get Ethernet Information

  • Get Ethernet Information
  • Download:getEthInfo.c

    根據Linux Network Programming我寫了以下一個綜合範例。可以由程式取得IP,SubMask,MAC這些資訊。

    這個函式裡使用struct ifreq這個結構,如果你有自行去查閱net/if.h這個標頭檔,你可能會對struct sockaddr_in這個型態轉型感到困惑,而實際上struct sockaddr跟struct sockaddr_in這兩個是相互對應的結構,所以你可以使用如之前type-Casting所提到的技巧來處理。

[C/C++] Type-Casting Conversion

  • Type-Casting Conversion
  • 現在的高階語言已經將許多繁雜的事情給處理好了,型態轉型就是一個例子,但是在C語言裡面你必須自行處理,下面是一個簡易的Interger轉char的範例。

    輸出結果如下:

    對應的轉型結構如下:

    由上面的表格可以很清楚的看出轉型後結果。型態轉型可以算是指標應用裡複雜的部份,一旦你懂了上面的程式碼之後,遇到轉型的問題就不再只是亂使用了。

[C/C++] Socket Programming: Upload/Download

  • Socket Programming: Upload/Download
  • Download:upload_download_unix.zip

    繼上一篇[C/C++] Socket Connection我們將scoket connection延伸應用至檔案傳輸。流程圖如下:

    這個範裡我只實做upload和download兩個功能,為了要處理Nagle's algorithm所帶來的影響,所以我的程式實做方式會有點不同。其中主要的程式片段是在檔案下上傳的部份,如下:

    /*** Server.c in upload() ***/

    /* Send file data to client */
    do{
    memset(buffer, '\0', BUFF_SIZE+1);
    ret = fread(&buffer, sizeof(char), BUFF_SIZE, fp);
    ret = send(socket, buffer, ret, 0);
    if(ret == -1){
    fprintf(stderr, "Fail to send message to client\n");
    return 0;
    }
    }while((count += ret) < totalSize);

    /*** Client.c in upload() ***/

    /* Send file data to server */
    do{
    memset(buffer, '\0', BUFF_SIZE+1);
    ret = fread(&buffer, sizeof(char), BUFF_SIZE, fp);
    ret = send(socket, buffer, ret, 0);
    if(ret == -1){
    fprintf(stderr, "Fail to send message to server\n");
    return 0;
    }
    usleep(1000);
    fprintf(stderr, "\b\b\b\b\b\b\b%c%6.2f", 37, (double)((count+ret) * 100 / totalSize));
    }while((count += ret) < totalSize);

    ret為整數變數,用來承接所有接收到的大小,在這次的修正版裡全部的send(), recv()都以BUFF_SIZE為基礎,唯只有在檔案傳送的部份則是以fread()回傳數來決定。

    由於在遠端傳輸過程中並不像近端網路下的理想對等,所以在接收過程中我以檔案的總大小(totalSize)與目前接收的量做為是否繼續接收資料的依據。

    此版本是以Linux系統為基礎修正了一些之前沒有做的錯誤處理,並使用fork來作多人連線的功能,關於fork()的使用可以參考這一篇[C/C++] Process Programming - fork(),或者你也可以使用pthread來完成[C/C++] Multithreading Porgramming - pthread

[C/C++] Socket Connection

  • Socket Connection
  • 節錄自筆者的Network Programming其中的資料,一般在Windows底下如果要寫網路程式多半會想到Microsoft MFC提供的相關API,而Linux底下則多使用Unix Socket來實現,這裡筆者要簡短的介紹如何使用最基礎的socket函式來實做socket connection。

    在正式進入程式碼之前還是要先簡單了解一下基本的OSI Model。

    只是想要藉由這張圖來讓讀者知道我們現在做的部份是在OSI七層中的最上層-應用層。有了上面的簡單概念後我們可以開始來看程式碼了。

    Download:Server.c

    Download:Client.c

    這是一個主從式的架構(Server-Client),為了讓程式碼可以在Linux以及Windows上運行,特別針對這兩個平台來撰寫。我們先來看一下流程圖。

    其中Initial WSA這個部份是Windows才需要的,其餘兩個平台都可適用。

    ########Server Side (Server.c) ###########

    • Library
    • 以Windows Socket來說,我們使用了winsock1.1來實做,而unix部份則是一般的unix socket。

    • Init WSA
    • 如同前面所提,Windows Socket需要初始化WSA才能使用。

    • Create a Socket
    • 建立一個Socket,其中比較重要的是SOCK_STREAM,定義這個socket是以stream的型態來傳輸,另外還有raw,datagram等型態,您可以自行查閱網路。

    • Setup Address & Port
    • 設定IP跟Port的部份其實很直觀,只是在型態的部份可能會讓讀者很困惑。

    • Bind Socket
    • 將socket server跟sockaddr in給bind起來,如此才能傳送接收訊息。也許你會問為什麼還要這麼麻煩做那麼多事情,別忘了這裡是socket最低階的寫法,自然什麼事情都要自己來啦!

    • Listener
    • 監聽Client端的連線,其中10是最大Quene值,代表著同時間可以有10個人在等待連線。

    • Wait for Accepting
    • 等待Client端做確認才完成一個socket連線

    • Close Socket
    • 如同開檔關檔一樣,使用完連線請關閉它。

    ########### Client Side (Client.c) #############

    如果你看得懂Server的部份,那Client就更沒問題了,Client的部份很簡單,只是建立一個Socket然後去對Server做連線

    只是不要忘了Client端的IP設定要設成Server的IP(不然你要連去哪裡?),既然是要去連Server那當然是用Connect()函式,重點只有這個部份,連線完後也記得關閉檔案。

    透過上面的簡單Server-Client的連線範例你就可以寫出許多網路連線程式了。

    編譯方式:

    GCC:

    • gcc -o server server.c
    • gcc -o client client.c

    MinGW:

    • gcc -o server server.c -lwsock32
    • gcc -o client client.c -lwsock32

    這裡特別說明MinGW的部份,雖然MinGW是適用於Windows底下的GCC,但是library的部份還是得要使用由MinGW所提供的才能編譯,wsock32是winsocket 1.1,而ws2_32是winsocket2.0的library。

    程式一開始的定義載入了wsock32.lib那是給Visual C++使用的,所以同樣的你也可以直接複製上面的程式碼到Visual C++去編譯成Console程式。

    參考資料:

    關於Unix Socket設計的部份我很推薦下面的資料

    除此之外,有時間的話也可以參考Linux System Programming的 I/O部份,有助於了解socket通訊的底層概念。

    另外還有微軟的MSDN裡的WinSocket資訊:

    http://msdn.microsoft.com/en-us/library/ms740673(VS.85).aspx

    以及IBM的i5/OS Communication的部份:

    http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/rzab6/rzab6soxoverview.htm

    如果你需要將c socket的部份封裝成C++的形式,下面是我將C Socket轉成C++的範例:

    Download: C++ Socket

    另外你還可以參考以下幾篇較進階的文章

    [C/C++] Socket Programming: Upload/Download

    [C/C++] Socket Programming: Get Ethernet Informati...

    [C/C++] Scoket Programming : Non-Blocking Communat...

    [C.C++] Socket Programming: MultiPerson Chat

Synapse - Papapaçoca

  • Synapse - Papapaçoca
  • 這是2007年Imagine cup ShortFlim決賽的影片,很喜歡設計者的思維,有興趣的人可以花個時間觀看。


Orange - data analysis tool

Installation pip install orange3 Run orange python -m Orange.canvas