2008年7月8日 星期二
Linux環境下的Socket programming
什麼是Socket
Socket接口是TCP/IP網絡的API,Socket接口定義了許多函數或例程,程序員可以用它們來開發TCP/IP網絡上的應用程序。要學Internet上的TCP/IP網絡編程,必須理解Socket接口。
Socket接口設計者最先是將接口放在Unix操作系統裡面的。如果瞭解Unix系統的輸入和輸出的話,就很容易瞭解Socket了。網絡的 Socket數據傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket也具有一個類似於打開文件的函數調用Socket(),該函數返 回一個整型的Socket描述符,隨後的連接建立、數據傳輸等操作都是通過該Socket實現的。常用的Socket類型有兩種:流式Socket (SOCK_STREAM)和數據報式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對於面向連接的TCP服務應用;數據 報式Socket是一種無連接的Socket,對應於無連接的UDP服務應用。
Socket建立
為了建立Socket,程序可以調用Socket函數,該函數返回一個類似於文件描述符的句柄。socket函數原型為:
int socket(int domain, int type, int protocol);
domain指明所使用的協議族,通常為PF_INET,表示互聯網協議族(TCP/IP協議族);type參數指定socket的類型: SOCK_STREAM 或SOCK_DGRAM,Socket接口還定義了原始Socket(SOCK_RAW),允許程序使用低層協議;protocol通常賦值"0"。 Socket()調用返回一個整型socket描述符,你可以在後面的調用使用它。
Socket描述符是一個指向內部數據結構的指針,它指向描述符表入口。調用Socket函數時,socket執行體將建立一個Socket,實際上"建立一個Socket"意味著為一個Socket數據結構分配存儲空間。Socket執行體為你管理描述符表。
兩個網絡程序之間的一個網絡連接包括五種信息:通信協議、本地協議地址、本地主機端口、遠端主機地址和遠端協議端口。Socket數據結構中包含這五種信息。
如何存取VM ware 機器內的資料到PC上面
(1) 使用 winSCP
(2) 利用 Samba (設定一次一勞永逸)
===========================================
(1) 使用 winSCP
- 到這裡去看如何使用 WinSCP 簡易教學(Mini User Guide) http://www.ascc.sinica.edu.tw/winscp
- 灌好上述軟體後,到你的虛擬機器去設定你的網路卡
- 請看下面圖片Eathnet請設定 Host-only
- 然後下指令 ifconfig 找到你的網路IP 例如 下面圈起來的地方
- 接著打開winscp 登入你的虛擬機器,接著應該就會如上面教學的樣子可以連接兩個系統了
- 請點圖片可以放大
=============================================
另外依各更簡單的方法
(2) 利用 Samba (設定一次一勞永逸)
- 接著請跟著我在VMware裡面這樣做
- # vi /etc/samba/smb.conf
- 然後 找到裡面有 [homes] 的地方在下面 browseable 改成 yes
- 在下面加一行字 path = /root /*這裡是你要分享的資料夾*/
- 在 [global] 中加入 一行 netbios name = XXX /*自訂網路電腦名稱*/
- 然後存檔離開
- 請再重新開機 # reboot
- 這樣就可以了....
- 到PC的我的電腦上的網址列 打 \\XXX
- 登入帳號及密碼就是你的VMware的帳號密碼 例如 root /root
- 然後你就可以看到分享的資料夾了,你就可以在PC上直接打一打程式碼丟上去就可以了
- 點圖可以放大

2008年7月4日 星期五
ARM 的第一隻組合語言
使用工具:IAR.ARM.ADS1.2
我的第一隻組合語言,哈哈!!!
=============================
;ARM ASM Example
;
AREA ARMex, CODE, READONLY
ENTRY
start
MOV r0,#10
MOV r1,#3
ADD r0,r0,r1
stop
MOV r0,#0x18
LDR r1,=0x20026
SWI 0x123456
END
Linux device driver 的種類
Linux device driver 的種類:
(1) Char module
- open, read, write, close
- 像檔案一樣存取,ex: /dev/console ; /dev/ttys0
- 只能循序存取
(2) Block module
- 一個block (512bytes)
- request queue . 無read, write
↑___command - hot plug(熱插拔)
(3) Network module (機構獨樹一格,無法掌控、不可預期)
- 封包收發時機? 不可預期
Kernel Module V.S. Programs
Programs : begin with main()
Kernel Module: begin with init_module() ; end by cleanup_module()
Insert ==> init_module()
Remove ==> cleanup_module()
2008年6月28日 星期六
Linked list
(optional): 試試讓該Linked list反轉,該如何做?
========================================================
拙著,請指教......
// 使用動態記憶體配置與linked list 撰寫程是讓使用者逐一輸入學生姓名,
// 成績,並依成績高低由高至低排好結點串接的順序,並可印出學生成績,
// 以及查詢某位學生成績
#include
#include
typedef struct TagStudent
{
char name[30];
int grade;
struct TagStudent *next;
}Student;
void InsertStudent(char newname[30],int newgrade);
int StudentCount();
void StudentPrint();
void StudentSearch(char search[]);
Student Head,*ptr=&Head,*current,*previous;
int main(int argc, char *argv[])
{
char ch,Newname[10],SearchName[10];
int Newgrade;
puts("學生成績查詢及輸入系統(停止輸入請按q或Q)\n");
while(1) //當按下不是 Ctrl+q 時
{
printf("請輸入學生姓名:");
scanf("%s",Newname);
if(!stricmp(Newname,"q")) break;
printf("請輸入成績:");
scanf("%d",&Newgrade);
InsertStudent(Newname,Newgrade);
}
puts("輸入結束!!");
printf("共有%d個學生\n",StudentCount());
StudentPrint();
printf("\n請輸入欲查詢學生姓名:");
scanf("%s",SearchName);
StudentSearch(SearchName);
system("PAUSE");
return 0;
}
void StudentSearch(char search[])
{
Student *p=ptr->next;
while(p!=NULL)
{
if(!strcmp(search,p->name))
printf("%s 成績:%d\n",p->name,p->grade);
p=p->next;
}
}
void StudentPrint()
{
Student *p = ptr->next;
while(p!=NULL)
{
printf("姓名:%s \t 分數:%d\n",p->name, p->grade);
p = p->next;
}
}
int StudentCount()
{
int count=0;
Student *p = ptr->next;
while(p!=NULL)
{
count++;
p = p->next;
}
return count;
}
void InsertStudent(char newname[],int newgrade)
{
Student *NewNode;
NewNode=(Student*)malloc(sizeof(Student));
if(NewNode == NULL)
puts("malloc Fail!!");
strcpy(NewNode->name ,newname);
NewNode->grade = newgrade;
NewNode->next=NULL;
if(StudentCount()==0)
{
NewNode->next = ptr->next;
ptr->next = NewNode;
}else
{
previous = ptr;
current = ptr->next;
while(current->grade > NewNode->grade)
{
previous = current;
if (current->next != NULL)
current=current->next;
else
goto END;
}
NewNode->next = current;
END:
previous->next = NewNode;
}
}
2008年7月 課表
| 年月:2008年7月 課表 | << 依班級:SI502 >> | 製成時間:2008/7/1上午 01:40:04 |
週別 | 星期一 | 星期二 | 星期三 | 星期四 | 星期五 | 星期六 | 星期日 | |
1 週 | 上 午 | 6/30 | 7/1 陳衍華 TCP/IP 310 | 7/2 黃馨瑧 DS 310 | 7/3 蔡宜璋 嵌入式處理器架構 310 | 7/4 李志賢 OS 310 | 7/5 鄧淇文 驅動程式 310 | 7/6 鄧淇文 驅動程式 310 |
| 下 午 | | 李志賢 OS 310 | 李志賢 黃馨瑧 專題 孫文駿 106 | 蔡宜璋 嵌入式處理器架構 310 | 黃馨瑧 程式設計(C/C++) 310 | 鄧淇文 驅動程式 310 | 鄧淇文 驅動程式 310 | |
| 夜 間 | | | | | | | | |
2 週 | 上 午 | 7/7 | 7/8 李俊傑 Socket程式 310 | 7/9 黃馨瑧 程式設計(C/C++) 310 | 7/10 黃馨瑧 程式設計(C/C++) 310 | 7/11 李俊傑 Socket程式 310 | 7/12 蔡宜璋 嵌入式處理器架構 310 | 7/13 鄧淇文 驅動程式 310 |
| 下 午 | | 李志賢 OS 310 | | 李志賢 OS 310 | 黃馨瑧 程式設計(C/C++) 310 | 蔡宜璋 嵌入式處理器架構 310 | 鄧淇文 驅動程式 310 | |
| 夜 間 | | | 孫文駿 Linux程式設計 310 | | | | | |
3 週 | 上 午 | 7/14 | 7/15 | 7/16 孫文駿 Linux程式設計 310 | 7/17 李俊傑 Socket程式 310 | 7/18 專題觀摩 310 | 7/19 蔡宜璋 嵌入式作業系統 310 | 7/20 鄧淇文 驅動程式 310 |
| 下 午 | | 李俊傑 Socket程式 310 | 黃馨瑧 程式設計(C/C++) 310 | 黃馨瑧 DS 310 | 李志賢 OS 310 | 蔡宜璋 嵌入式作業系統 310 | 鄧淇文 驅動程式 310 | |
| 夜 間 | | | | | | | | |
4 週 | 上 午 | 7/21 | 7/22 | 7/23 李俊傑 Socket程式 310 | 7/24 李俊傑 Socket程式 310 | 7/25 李志賢 OS 310 | 7/26 蔡宜璋 嵌入式作業系統 310 | 7/27 鄧淇文 驅動程式 310 |
| 下 午 | | 黃馨瑧 程式設計(C/C++) 310 | 李志賢 OS 310 | 李志賢 黃馨瑧 專題 孫文駿 310 | 黃馨瑧 DS 310 | 蔡宜璋 嵌入式作業系統 310 | 鄧淇文 驅動程式 310 | |
| 夜 間 | | | | | | | | |
5 週 | 上 午 | 7/28 | 7/29 | 7/30 李俊傑 Socket程式 310 | 7/31 黃馨瑧 DS 310 | 8/1 李俊傑 Socket程式 310 | 8/2 陳裕生 嵌入式Linux系統 310 | 8/3 鄧淇文 嵌入式作業系統 310 |
| 下 午 | | | 李志賢 OS 310 | 李志賢 黃馨瑧 專題 孫文駿 106 | 李志賢 OS 310 | 陳裕生 嵌入式Linux系統 310 | 鄧淇文 嵌入式作業系統 310 | |
| 夜 間 | | | | | | | | |
2008年6月13日 星期五
03.堆疊與佇列( Stack and Queue )
上課內容精要!!
3.1 堆疊和佇列基本觀念
堆疊(Stack)
加入(push)與刪除(pop)於同一端。後進先出(LIFO)
例子:堆積木、蓋房子
佇列(Queue)
加入與刪除於不同端(front & rear)。先進先出(FIFO)
例子:排隊買票、坐公車
3.2 堆疊的加入與刪除
3.2.1 堆疊加入函數(top的初始值為-1)
3.2.2 堆疊刪除函數
3.3 佇列的加入與刪除
3.3.1 佇列加入函數(front、rear的初始值分別為0、-1)
3.3.2 佇列刪除函數
[ 問題 ] 佇列前端還有空位,但要加入元素卻發現此佇列已滿
[ 解決方式 ] 環狀佇列
3.3.3 環狀佇列加入函數(front、rear的初始值均為MAX-1)
3.3.4 環狀佇列刪除函數
3.4 堆疊與佇列的應用
堆疊的應用 :副程式的呼叫 (subroutine calls)
中序表示式 → 後序表示式
佇列的應用 : 作業系統的工作安排(job scheduling)
中序表示式 :「運算子」(operator)置於「運算元」(operand)的中間
Ex: A*B / C
後序表示式 :「運算子」置於「運算元」的後面
Ex:AB * C /
3.5 如何計算後序表示式
利用<運算元堆疊法>
3.6 老掉牙的應用問題
數獨遊戲 (個人經常給學生玩的數獨網站) http://oddest.nc.hcc.edu.tw/sumain.htm
Algorithm Gossip: 八個皇后
老鼠走迷官(一)
河內塔
(以上三個連結取自 良葛格學習筆記 - 困在技術撰稿人身體裡的小說家)

