2008年7月8日 星期二

Linux環境下的Socket programming

大陸網站看來的,http://www.chinalinuxpub.com/read.php?wid=180

什麼是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
  1. 到這裡去看如何使用 WinSCP 簡易教學(Mini User Guide) http://www.ascc.sinica.edu.tw/winscp
  2. 灌好上述軟體後,到你的虛擬機器去設定你的網路卡
  3. 請看下面圖片Eathnet請設定 Host-only
  4. 然後下指令 ifconfig 找到你的網路IP 例如 下面圈起來的地方
  5. 接著打開winscp 登入你的虛擬機器,接著應該就會如上面教學的樣子可以連接兩個系統了
  6. 請點圖片可以放大


=============================================
另外依各更簡單的方法
(2) 利用 Samba (設定一次一勞永逸)

  1. 接著請跟著我在VMware裡面這樣做
  2. # vi /etc/samba/smb.conf
  3. 然後 找到裡面有 [homes] 的地方在下面 browseable 改成 yes
  4. 在下面加一行字 path = /root /*這裡是你要分享的資料夾*/
  5. [global] 中加入 一行 netbios name = XXX /*自訂網路電腦名稱*/
  6. 然後存檔離開
  7. 請再重新開機 # reboot
  8. 這樣就可以了....
  9. 到PC的我的電腦上的網址列 打 \\XXX
  10. 登入帳號及密碼就是你的VMware的帳號密碼 例如 root /root
  11. 然後你就可以看到分享的資料夾了,你就可以在PC上直接打一打程式碼丟上去就可以了
  12. 點圖可以放大


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

請使用動態記憶體配置與Linked list,撰寫一程式,可以讓使用者逐一輸入各學生的姓名與成績(int),並依成績高低由高到低排好節點串接的順序。並可印出所有學生的成績,以及查詢某一位學生的成績。

(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 佇列加入函數(frontrear的初始值分別為0-1)

3.3.2 佇列刪除函數

[ 問題 ] 佇列前端還有空位,但要加入元素卻發現此佇列已滿

[ 解決方式 ] 環狀佇列

3.3.3 環狀佇列加入函數(frontrear的初始值均為MAX-1)

3.3.4 環狀佇列刪除函數

3.4 堆疊與佇列的應用

堆疊的應用 :副程式的呼叫 (subroutine calls)

中序表示式 後序表示式

佇列的應用 作業系統的工作安排(job scheduling)

中序表示式 :「運算子」(operator)置於「運算元」(operand)的中間

Ex A*B / C

後序表示式 :「運算子」置於「運算元」的後面

ExAB * C /

3.5 如何計算後序表示式

利用<運算元堆疊法>

3.6 老掉牙的應用問題

數獨遊戲 (個人經常給學生玩的數獨網站) http://oddest.nc.hcc.edu.tw/sumain.htm

Algorithm Gossip: 八個皇后

老鼠走迷官(一)

河內塔

(以上三個連結取自 良葛格學習筆記 - 困在技術撰稿人身體裡的小說家)