2016年12月6日 星期二

編譯Gstreamer ( on windows)

詳細的教學文件

首先嘗試編譯Gstreamer所提共的19個範例

1.下載Gstreamer的安裝檔,共兩個檔案(下載位置),選擇自己要的版本。
      gstreamer-1.0-x86_64-1.10.2
      gstreamer-1.0-devel-x86_64-1.10.2
    皆選擇完整安裝即可。


2.下載Gstreamer的範例檔(下載位置)
     下載回來後可以在 gst-docs\examples\tutorials\vs2010 找到"tutorials.sln"。
      為了避免改到範例的內容,建議將tutorials資料夾複製到自己想要的位置。

3.用 VS2015 打開"tutorials.sln",選擇 "建置->建置方案",官網上說明應該19個範例都可以編譯成功,但我只成功了14個。檢查code後發現都是缺少某些Win32檔案造成,想嘗試的人或許可以試著用x86的版本試試看。

每個範例的說明網站(Eng)中文









2016年9月20日 星期二

centOS無法識別1280x960 解析度的解決方法

在 terminal 中使用cvt生成modeline信息(可以用#cvt -h查看cvt詳細訊息)
#cvt -v 1280 960
terminal 顯示訊息如下:
Modeline "1280x960_60.00"  101.25  1280 1360 1488 1696  960 963 967 996 -hsync +vsync

去掉 modeline 後,接著透過 xrandr 設定解析度
#xrandr --newmode "1280x960_60.00"  101.25  1280 1360 1488 1696  960 963 967 996 -hsync +vsync
#xrandr --addmode VGA1 "1280x960_60.00"
#xrandr --output VGA1 --mode "1280x960_60.00"

搞定~



2016年8月11日 星期四

install Mono on ubuntu

install Mono on ubuntu
ref:
http://www.mono-project.com/docs/getting-started/install/linux/#debian-ubuntu-and-derivatives
http://alvin1016.blogspot.tw/2015/03/ubuntunetmono.html
========================================================================

sudo apt-get install mono-complete

sudo apt-get install mono-runtime


# sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF

# echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list

# sudo apt-get update

get Error :
GPG error: http://hyperrate.com eliu Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 5C577D59835AB0E3

# sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 5C577D59835AB0E3

try again
# sudo apt-get update

# echo "deb http://download.mono-project.com/repo/debian wheezy-apache24-compat main" | sudo tee -a /etc/apt/sources.list.d/mono-xamarin.list

# sudo apt-get install mono-devel  mono-complete referenceassemblies-pcl

=======================================================================
testing mono (hello.cs)

using System;

public class HelloWorld
{
    static public void Main ()
    {
        Console.WriteLine (" Mono Mono ");
    }
}

compile
# mcs hello.cs

Run hello.exe
# mono hello.exe

YO~~~~~~~ it's working ~~~~~

2016年7月5日 星期二

CentOS 變更開機順序


因為安裝雙系統的關係,所以,開機選單是由 Linux 的 Grub 來控管。

1.編輯Grub檔案決定開機順序(需要root權限)
sudo vim /boot/grub/grub.conf

裡面最關鍵的兩行
default=0(預設的開機選項)
timeout=5(開機選單到數的秒數,在這裡設定為5秒)

至於 "default=0" 所代表的意思為設定第0個選項為預設開機選項。

舉例來說,進到 grub.conf 檔案後可以看到
title CentOS (xxxxx)
title windows (xxxxx)
title other (xxxxx)
其中 "CentOS"就是第0項,windows為第1項,以此類推




2016年5月15日 星期日

socket 筆記

以下詳細解釋來自 XYZ的筆記本 大大,自己另外做的筆記。

1.在 Windows 使用 Socket 需要 link Winsock Library。[server端] [client端]
   在程式中加入
   #pragma comment(lib, "wsock32.lib") 或 #pragma comment(lib, "Ws2_32.lib")

   wsock32.lib 和 Ws2_32.lib 的區別:
  • wsock32.lib 是較舊的 1.1 版本,Ws2_32.lib 是較新的 2.0 版本。
  • wsock32.lib 跟 winsock.h 一起使用,Ws2_32.lib 跟 WinSock2.h 一起使用。
  • winsock.h 和 WinSock2.h 不能同時使用,WinSock2.h 是用來取代 winsock.h,而不是擴展 winsock.h。
2.建立 socket descriptor。[server端] [client端]
   函式:SOCKET socket( int af, int type, int protocol); 
          int af:使用何種通訊。
  • 例如
    AF_INET:使用 IPv4
    AF_INET6:使用 IPv6
   int type:The type specification for the new socket.
  • 能用的值跟 " int af " 參數有關
  • 例如
    SOCK_STREAM:使用 TCP 協議
    SOCK_DGRAM:使用 UDP 協議
   int protocol:The protocol to be used.
  • 例如
    IPPROTO_TCP:使用 TCP
    IPPROTO_UDP:使用 UDP
   成功回傳 socket descriptor,失敗回傳 INVALID_SOCKET。可善用 " INVALID_SOCKET " 來檢查是否成功。

3.設定位址資訊的資料 (SOCKADDR_IN)。[server端] [client端]  
   結構:使用 IP4 格式結構 struct sockaddr_in (in 表示 internet) 設定 internet 位址資訊。
  • struct sockaddr_in:IPv4 使用
  • struct sockaddr_in6:IPv6 使用
  • struct sockaddr:通用格式
  • struct sockaddr_un:UNIX domain 格式

      4.綁定 socket 的位址資料 (bind)。[server端]
         函式:int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
         int sockfd:socket() 函式回傳的 socket descriptor
         struct sockaddr *my_addr:用來通訊的位址資料(IP、PORT)
         int addrlen:位址長度 ,sizeof(my_addr)
         綁定成功回傳 0,失敗回傳 SOCKET_ERROR。可善用 " SOCKET_ERROR " 來檢查是否成功。
      5.監聽連線 (listen)。[server端]   函式:int listen(SOCKET s,  int backlog)
      • SOCKET s:socket() 函式回傳的 socket descriptor。
      • int backlog:最大可監聽多少連線(佇列、排隊)。設定 SOMAXCONN 表示系統最大值。
      • 成功回傳 0,失敗回傳 SOCKET_ERROR。
      • connection-oriented ( SOCK_STREAM ) 的 server 程式端程式才使用。
      6.連線到 socket Server。[client端]
         函式:int connect(SOCKET s, const struct sockaddr *name, int namelen)
      • SOCKET s:socket() 函式回傳的 socket descriptor。
      • const struct sockaddr *name:Server 端的位址資料。
      • int namelen:第二個參數的大小。
      • 成功回傳 0,失敗回傳 SOCKET_ERROR,可用 WSAGetLastError() 取得 error code。
      7.傳送訊息。[server端] [client端]   
         函式 1:int send(SOCKET s, const char *buf, int len, int flags)   
         函式 2:int sendto(SOCKET s, const char *buf, int len, int flags, const struct sockaddr *to, int tolen)
      • send() 和 sendto() 的差異在於,send() 只能用在 connection-oriented ( SOCK_STREAM ) 的連線,所以 sendto() 比 send() 多最後兩個參數,用來指定目的地的位址資訊。
      • SOCKET s:socket() 函式回傳的 socket descriptor。
      • const char *buf:訊息的指標。
      • int len:訊息的長度。
      • int flags:The flags parameter can be used to influence the behavior of the function beyond the options specified for the associated socket。(一般設 0)
      MSG_DONTROUTE:不將訊息送給 gateway,而直接送給 host。(Specifies that the data should not be subject to routing. A Windows Sockets service provider can choose to ignore this flag.)
      MSG_OOB:Sends OOB data (stream-style socket such as SOCK_STREAM only)。
      • const struct sockaddr *to:目的地位址資訊。
      • int tolen:目的地位址資訊的大小。
      • 成功回傳傳送的資料長度,失敗回傳 SOCKET_ERROR。
      8.接收訊息。[server端] [client端]   
         函式 1:int recv(SOCKET s, char *buf, int len, int flags)   
         函式 2:int recvfrom(SOCKET s, char *buf, int len, int flags, struct sockaddr *from, int *fromlen)
      • recv() 和 recvfrom() 的差異在於,recv() 只能用在 connection-oriented ( SOCK_STREAM ) 的連線,所以 recvfrom() 比 recv() 多最後兩個參數,用來指定接收來源的位址資訊。
      • SOCKET s:socket() 函式回傳的 socket descriptor。
      • const char *buf:訊息的指標。
      • int len:訊息的長度。
      • int flags:The flags parameter can be used to influence the behavior of the function invocation beyond the options specified for the associated socket.。(一般設 0)
      MSG_PEEK:Peeks at the incoming data。只看訊息內容,但不將訊息從 queue 移除。
      MSG_OOB:Processes Out Of Band (OOB) data。
      • const struct sockaddr *to:目的地位址資訊。
      • int tolen:目的地位址資訊的大小。
      • 成功回傳接收的資料長度,連線被關閉回傳 0。失敗回傳 SOCKET_ERROR。
      9.設定 socket option 選項。[server端] [client端]
         函式 :int setsockopt(SOCKET s, int level, int optname, const char *optval, int optlen)
         用來設定建立的  socket 一些特性,例如是否強制關閉等。
      10.關閉 socket。[server端] [client端]
           函式 :int closesocket(SOCKET s)
      ===============================================================
      編譯環境

      win7 + CodeBlocks16.01 + MinGW

      Scoket Server 範例:
      執行後會等待 client 端連線,有連線進來時,則傳送 "sending data test" 訊息給 client 端。



      #pragma comment(lib, "Ws2_32.lib")
      #include <WinSock2.h>
      #include <iostream>
      using namespace std;
      void main(){
          int r;
          WSAData wsaData;
          WORD DLLVSERION;
      char *message;

          DLLVSERION = MAKEWORD(2,1);//Winsocket-DLL 版本
          //用 WSAStartup 開始 Winsocket-DLL
          r = WSAStartup(DLLVSERION, &wsaData);
          //宣告 socket 位址資訊
          SOCKADDR_IN addr;
          int addrlen = sizeof(addr);
          //建立 socket
          SOCKET sListen; //listening for an incoming connection
          SOCKET sConnect; //operating if a connection was found
          //AF_INET:表示建立的 socket 屬於 internet family
          //SOCK_STREAM:表示建立的 socket 是 connection-oriented socket
          sConnect = socket(AF_INET, SOCK_STREAM, NULL);
          //設定位址資訊的資料
          addr.sin_addr.s_addr = inet_addr("127.0.0.1");
          addr.sin_family = AF_INET;
          addr.sin_port = htons(1234);
          //設定 Listen
          sListen = socket(AF_INET, SOCK_STREAM, NULL);
          bind(sListen, (SOCKADDR*)&addr, sizeof(addr));
          listen(sListen, SOMAXCONN);//SOMAXCONN: listening without any limit
          //等待連線
          SOCKADDR_IN clinetAddr;
      c = sizeof(struct sockaddr_in);

          while( (sConnect = accept(sListen , (struct sockaddr *)&clinetAddr, &c)) != INVALID_SOCKET ){
      puts("Connection accepted"); //Reply to the client message = "Hello Client , I have received your connection. But I have to go now, bye\n"; send(sConnect , message , strlen(message) , 0);
      }
      }



      Socket Client 範例:



      #pragma comment(lib, "Ws2_32.lib") 

      #include <WinSock2.h>

      #include <iostream>

      #include <string>


      using namespace std;


      void main(){

          string confirm;

          char server_reply[2000]; 

          //開始 Winsock-DLL

          int r;

          WSAData wsaData;

          WORD DLLVersion;

          DLLVersion = MAKEWORD(2,1);
          r = WSAStartup(DLLVersion, &wsaData);
          //宣告給 socket 使用的 sockadder_in 結構
          SOCKADDR_IN addr;
          int addlen = sizeof(addr);
          //設定 socket
          SOCKET sConnect; 
          //AF_INET: internet-family
          //SOCKET_STREAM: connection-oriented socket
          sConnect = socket(AF_INET, SOCK_STREAM, NULL);
          //設定 addr 資料
          addr.sin_addr.s_addr = inet_addr("127.0.0.1");
          addr.sin_family = AF_INET;
          addr.sin_port = htons(1234);

          connect(sConnect, (SOCKADDR*)&addr, sizeof(addr));
          //接收 server 端的訊息
          puts("Connected");
      //Receive a reply from the server if((recv_size = recv(sConnect , server_reply , 2000 , 0)) == SOCKET_ERROR){
      puts("recv failed"); } puts("Reply received\n"); //Add a NULL terminating character to make it a proper string before printing server_reply[recv_size] = '\0'; puts(server_reply);
          //設定 closesocket 時,不經過 TIME-WAIT 過程,直接關閉socket
          //BOOL bDontLinger = FALSE;
          //setsockopt(sConnect,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));             
          //若之後不再使用,可用 closesocket 關閉連線
          closesocket(sConnect);