Social Icons

twitterfacebookgoogle plusrss feedemail

5/30/2013

C語言製作音樂 -小蜜蜂

沒有留言:

其實寫程式並沒有那麼的無趣~
大家可以用C語言寫些歌曲出來XD

以下程式碼如果不能執行,應該是編碼問題~ 可以直接下載.C檔
載點一
載點二

5/27/2013

JAVA 網路程式-基本的Client & Server 檔案傳送

沒有留言:
因為有人來問我JAVA版的網路程式要怎麼寫,所以這邊就稍微解釋一下簡單的JAVA檔案傳送!
程式可以用來傳送文字檔、影片檔...等檔案,但是在網路不穩定時會出問題唷~
因為這只是簡單的範例程式,想要更進一步請參考檔案傳送與效能分析
server

client

5/21/2013

ISOLinux 如何製作開機光碟

沒有留言:
前面已經講過如何製作USBlinux

相關連結
[USB linux] 1.打造2MB 的 linux USB 隨身碟
[USB linux] 2.核心編譯
[USB linux] 3.建立ramdisk的root filesystem (initrd)
[USB linux] 4.建置busybox
[USB linux] 5.最後步驟建置boot loader

至於要如何把自己做的kernel做成開機光碟或者iso檔給別人下載呢?
ISOLinux中告訴我們要這麼做
  • Make sure you have a recent enough version of mkisofs. I recommend mkisofs 1.13 (distributed with cdrecord 1.9), but 1.12 might work as well (not tested). Binary versions for Windows can be found on the web.
  • Download Syslinux
  • Create a directory called "CD_root". This is the ISO image master file tree
    • Copy all files you want to have on the CD into this directory
  • Create a directory called "isolinux" underneath the directory "CD_root"
  • Create directories "images" and "kernel" underneath the directory "CD_root"
    • Copy any floppy images you want to boot into "images"
    • Copy "memdisk/memdisk" from the Syslinux archive into "kernel"
  • Use the following command to create your ISO image:
mkisofs -o output.iso \
   -b isolinux/isolinux.bin -c isolinux/boot.cat \
   -no-emul-boot -boot-load-size 4 -boot-info-table \
   CD_root
The file boot.cat will be automatically created.

[USB linux] 5.最後步驟建置boot loader

沒有留言:
boot loader的責任是接手BIOS的開機任務,負責找出kernel image的所在位置,
載入kernel到記憶體中,傳給kernel image適當的參數,接著將執行權交給kernel,完成開機

我們要先為隨身碟寫入boot loader,我們使用syslinux
syslinux是一個Linux的boot loader,專為fat檔案系統設計的,
一般的隨身碟通常為fat32,軟碟也適用
 syslinux /dev/sdc1
sdc1請更改為你的裝置名稱

如果你不確定你的隨身碟在哪一個裝置,可以用df指令看掛載點

再來要編輯boot loader的設定檔
vi syslinux.cfg
內容如下:
default linux
prompt 1
timeout 10
label linux
kernel bzImage
append initrd=initrd.img vga=792
內容主要指定kernel映像檔、ramdisk、螢幕的參數等

[USB linux] 4.建置busybox

沒有留言:


Linux下常見的指令,都是由「程式」所組成,但是這些程式如果全部放進來,也會佔掉不少空間,因此有了busybox
busybox包含了數十種Linux下常見的標準工具,例如ls, cp, cat, more....
甚至包含了http server,但是全部加起來都只有幾百k的大小,是作為嵌入式系統工具庫更好的選擇。

下面就來介紹該怎麼組態、編譯、安裝busybox

回到我們的工作目錄,並解開busybox

 cd ~/build-usb-linux
 tar -jxf busybox-1.13.2.tar.bz2
 cd busybox-1.13.2
先進行組態設定
 make menuconfig

先設定安裝目錄,將installation prefix設為剛剛所建立的ramdisk掛載點
這邊不能使用"~"來作為家目錄,所以你必須填上完整的路徑。
  Busybox Settings  --->
    Installation Options  --->
      (/home/koukai/build-usb-linux/initrd
) BusyBox installation prefix
設定交叉編譯器的選項如下的cross compiler prefix,但因為我們要跑在自己電腦上,所以可以忽略交叉編譯器的設定無所謂,
  Busybox Settings  --->
    Build Options  --->
      [*] Build BusyBox as a static binary (no shared libs)
      ()  Cross Compiler prefix
例如你所用的是arm-linux-gcc,就要將prefix設為arm-linux-

然後要選取將busybox編為靜態連結!!!!

[USB linux] 3.建立ramdisk的root filesystem (initrd)

沒有留言:
接下來,要建立Linux的root filesystem,也就是打造整個Linux下面的檔案系統環境
為什麼要放在ramdisk呢?一來速度快,二來ramdisk映像檔經過壓縮可以變得更小。
缺點是檔案系統要更新的話很麻煩,要重新掛載映像檔、修改、卸載、壓縮。
不過嵌入式系統的變更頻率不高,這樣做還是ok的。
這個ramdisk叫做是initrd,initial ramdisk。

首先,建立一個zero-filled的檔案,全設為0可以讓壓縮未用的空間更有效率。
我們從/dev/zero處複製一共8192個block到ramdisk這個檔案中,每個block大小為1k,因此這個檔案為8MB
 cd ~/build-usb-linux
 dd if=/dev/zero of=ramdisk bs=1k count=8192


接著,將他格式化成ext2的格式。
 mkfs.ext2 -v -F -m0 ramdisk

我們將他掛載起來,就像掛載虛擬光碟一樣。
 mkdir initrd
 sudo mount -o loop ramdisk initrd/

[USB linux] 2.核心編譯

沒有留言:
核心是Linux最重要的部份,也是最久的部分

直接來吧!
回到我們的工作目錄,並解開核心原始檔 cd ~/build-usb-linux
 tar -jxf linux-2.6.26.8.tar.bz2

 cd 
linux-2.6.26.8
再來,進行組態設定
 make menuconfig
選單的操作方式,與怎麼選擇kernel的內部鳥哥的Linux私房菜 核心編譯 

這邊暫時全部都使用默認選項,打開
menuconfig直接 存檔離開即可,接著便可以開始編譯了
 make
大概會跑個好幾十分鐘,如果你用虛擬機器的話,可能會更久Orz
最後在kernel資料夾/arch/$(ARCH)/boot/目錄會產生bzImage,將他複製到隨身碟
$(ARCH)請自行代換成你的cpu架構,可能是ARM、i386(較舊的核心)、x86、x86-64!



檔案傳送與效能分析(4)-程式下載

沒有留言:
雖然還沒開始看程式碼,但這邊我還是要先稍微說明一下我程式上的幾個問題點。
(寫在後面就沒人想看了(=...=)

1.由於在寫這份作業時得到重感冒...程式碼的部分寫得非常不好...,這邊很抱歉之後有空我會再改改。
2.不該使用nonblock因為會使效能變差
3.應該要設定SO_SENDTO,在這邊要注意一下select並不能完全的取代掉SO_SENDTO!問題點在於write的buffsize大小會出問題(傳送者大,接收者小時,有機會發生問題)
4.盡量少使用fwrite,盡量使用system calls 也就是write。
5.改使用UDP在傳送時,記得每個封包前面要加上Sequence number,以及最後要判斷data是否遭到串改(類似checksum)。
6.在嵌入式系統的設備上盡量使用udp,因為嵌入式系統的晶片如果用來處理tcp的話,在某些方面來說處理可能太過於複雜。
....等

檔案傳送與效能分析(2)-基本的檔案傳送

沒有留言:
因為有太多人不知道怎麼寫檔案傳送..(汗)
在這邊弄一個簡單的範例給各位,不過請別忘了將以下程式修改達到以下目的
------------------------------------------------

1. 將作業一改成用 select, 不需使用http, 只需傳一個大檔, 譬如 1G 的 zip 檔
2. 設計 client, 不需顯示UI, 只需存檔, 只需用 zip 驗證正確性
3. 請不要用 sendfile 來處理, 這是練習
4. 當1個client 連線, 仍夠正確傳完, 分析您的處理過程
5. 當1個client 連線,  但是您的網路頻寬有限, 仍夠正確傳完.
6. 當多個(2個以上)client 連線, 仍夠正確傳完
7. 當接收端 (client), 程式異常終止, 製造SIGPIPE, 參考 man 7 siganl, 與範例
8. 處理 SIGPIPE
9. Server 與  Client 網路速度不匹配, 或bandwidth 不夠, 發生 send 這 system call, block 現象
10. 同時使用 Wireshark 分析TCP 現象
11. 不穩定網路續傳, 這需處理續傳問題, 如同http partial get 的問題
12. 連續傳送過程中, 設計 recv 或 read 回傳值 與期望大小不同的現象
13. 使用pthread 處理多工傳送
14. man 7 socket , SO_SNDTIMEO, 處理  send blocking 問題
15. 不要太相信 SO_LINGER 是好方法

16. pthread如果傳入參數時,會有什麼bug!
17. thread 中的結果如何用一般 stdout/stdin 或透過 unix domain socket  取代 (請參考http/cgi 程式), 這是下份作業


------------------------------------------------
以下附上"簡單"的檔案傳送接收範例,這只是參考的範例架構並不是本次實驗的目的...!!如果你拿這份來交作業...那我真不知道要說什麼了...
請不要直接複製下面程式碼,因為裡面會包含亂碼唷~ 請盡量自己打

common.h
#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <string.h>  
#include <sys/types.h>  
#include <sys/stat.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
  
#define PORT 6000  
#define LISTENQ 20  
#define BUFFSIZE 4096  
#define FILE_NAME_MAX_SIZE 512 

檔案傳送與效能分析(3)-斷線分析

沒有留言:
延續上一篇文章檔案傳送與效能分析(1)-實驗過程與結果
這篇要開始講解當程式發生問題時封包的狀態為何?以及一些斷線分析的範例程式碼。

斷線 RST封包問題

當伺服器 close一個連接時,若client端接著發數據。根據TCP協定的規定,會收到一個RST響應,client再往這個服務器發送數據時,系統會發出一個SIGPIPE信號給進程,告訴進程這個連接已經斷開了,不要再寫了。
    根據信號的默認處理規則SIGPIPE信號的默認執行動作是terminate(終止、退出),所以client會退出。若不想客戶端退出可以把SIGPIPE設為SIG_IGN

    如:    signal(SIGPIPE,SIG_IGN);//    這時SIGPIPE交給了系統處理。


 註:服務器採用了fork的話,要收集垃圾進程,防止僵屍進程的產生,可以這樣處理:  signal(SIGCHLD,SIG_IGN); //交給系統init去回收。
    這裡子進程就不會產生僵屍程序了。
這邊拿unpv13e 裡面的範例來修改當例子

解決XP 無法安裝 android deiver

沒有留言:
今天發現到原來某些 adnroid 設備在XP環境中沒辦法順利的安裝USB驅動,於是找了一些解決辦法,在這邊做一下紀錄~!

1.首先先至裝置管理員中選擇androdi裝置>右鍵內容

5/15/2013

資料結構 Tree 建置 與 印出

沒有留言:
有很多人不知道怎麼用C建立一顆簡單的樹...這邊PO上一個小範例
請注意這很久之前做的,程式上我有稍微修改~很多地方會有BUG (疑,主要是為了不讓同學直接抄答案...)

請將下面的程式碼做修改,達到以下目的
0.找出BUG
1.做交集聯集。
2.將樹改成 Complete. Binary Tree 完整(完美)二元樹
3.增加刪除節點

點圖可放大

5/14/2013

檔案傳送與效能分析(1)-實驗過程與結果

沒有留言:



建議切換全螢幕高畫質欣賞~!

本程式在實際網路可以正常執行,為了錄影方便所以才在同一台機器上做測試

看影片可能覺得很簡單...,平常的檔案傳輸都是在穩定的網路下做傳輸,而本程式在不穩定的網路下可以做到大檔傳送、斷線續傳、多工、timeout、pipe、reconnect...等功能...,雖然只是單純的傳送檔案...但寫起來要考慮的東西還真不少....。
影片內容忘記錄多工的部分.... ( 0 . 0)

實驗結果如下,之後有空再對步驟以及程式碼做解釋
(以下圖片點及都可以放大)
62byteTXT文字檔
49.9kb小圖檔(jpg)
1.1Mb大圖檔(jpg)
1014.5Mb壓縮檔(zip)

實驗測試網路環境:
1.都在同一台機器中
2.兩台有線網路
3.一台有線網路 一台無線網路 (此為影片拍測的環境)
4.兩台無線網路



傳輸時百分比進度


傳送文字檔封包分析


C語言 如何知道檔案大小

沒有留言:

1.利用fseek(或lseek)
FILE* f = fopen(fileName, "r+");
fseek(f, 0, SEEK_END);
size = ftell(f);
fseek(f, 0, SEEK_SET);


2.用stat函式
struct stat st;
stat(fileName, &st);
size = st.st_size;


其中stat結構如下

struct stat {
    dev_t     st_dev;     /* ID of device containing file */
    ino_t     st_ino;     /* inode number */
    mode_t    st_mode;    /* protection */
    nlink_t   st_nlink;   /* number of hard links */
    uid_t     st_uid;     /* user ID of owner */
    gid_t     st_gid;     /* group ID of owner */
    dev_t     st_rdev;    /* device ID (if special file) */
    off_t     st_size;    /* total size, in bytes */
    blksize_t st_blksize; /* blocksize for file system I/O */
    blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
    time_t    st_atime;   /* time of last access */
    time_t    st_mtime;   /* time of last modification */
    time_t    st_ctime;   /* time of last status change */
};

5/05/2013

解決 linux 沒有 itoa 問題解法

沒有留言:

因為在ANSI-C 與一些compiler中並沒有支援
所以在linux裡沒有itoa(int , char[] ,int) 這個函數
不過可用sprintf(str , "%d" ,i) 代替

itoa( 456 , str , 10)
sprintf(str, "%d" ,456)