(一)Linux網路編程--網路知識介紹
Linux網路編程--網路知識介紹
用戶端和服務端
網路程式和普通的程式有一個最大的區別是網路程式是由兩個部分組成的--用戶端和伺服器端.
用戶端
在網路程式中,如果一個程式主動和外面的程式通訊,那麼我們把這個程式稱為用戶端程式。 比如我們使用ftp程式從另外一
個地方擷取檔案的時候,是我們的ftp程式主動同外面進行通訊(擷取檔案), 所以這個地方我們的ftp程式就是用戶端程式。
服務端
和用戶端相對應的程式即為服務端程式。被動的等待外面的程式來和自己通訊的程式稱為服務端程式。
比如上面的檔案擷取中,另外一個地方的程式就是服務端,我們從服務端擷取檔案過來。
互為客戶和服務端
實際生活中有些程式是互為服務和用戶端。在這種情況項目, 一個程式既為用戶端也是服務端。
常用的命令
由於網路程式是有兩個部分組成,所以在調試的時候比較麻煩,為此我們有必要知道一些常用的網路命令
netstat
命令netstat是用來顯示網路的串連,路由表和介面統計等網路的資訊.netstat有許多的選項.
我們常用的選項是-na 用來顯示詳細的網路狀態.至於其它的選項我們可以使用協助手冊獲得詳細的情況.
telnet
telnet是一個用來登入遠端程式,但是我們完全可以用這個程式來調試我們的服務端程式的.
比如我們的伺服器程式在監聽8888連接埠,我們可以用
telnet localhost 8888
來查看服務端的狀況.
pingping 程式用來判斷網路的狀態是否正常,最經常的一個用法是
ping 192.168.0.1
表示我們想查看到192.168.0.1的硬體串連是否正常
TCP/UDP介紹
TCP(Transfer Control Protocol)傳輸控制通訊協定是一種連線導向的協議, 當我們的網路程式使用這個協議的時候,
網路可以保證我們的用戶端和服務端的串連是可靠的,安全的.
UDP(User Datagram Protocol)使用者資料包通訊協定是一種非連線導向的協議,
這種協議並不能保證我們的網路程式的串連是可靠的,所以我們現在編寫的程式一般是採用TCP協議的.
(二)Linux網路編程--初等網路函數介紹(TCP)
Linux系統是通過提供通訊端(socket)來進行網路編程的.網路程式通過socket和其它幾個函數的調用,
會返回一個 通訊的檔案描述符,我們可以將這個描述符看成普通的檔案的描述符來操作,這就是linux的裝置無關性的好處.
我們可以通過向描述符讀寫操作實現網路之間的資料交流.
(一)socket
int socket(int domain, int type,int protocol)
domain:說明我們網路程式所在的主機採用的通訊協族(AF_UNIX和AF_INET等).
AF_UNIX只能夠用於單一的Unix 系統處理序間通訊,
而AF_INET是針對Internet的,因而可以允許在遠程
主機之間通訊(當我們 man socket時發現 domain可選項是 PF_*而不是AF_*,因為glibc是posix的實現所以用PF代替了AF,
不過我們都可以使用的).
type:我們網路程式所採用的通訊協議(SOCK_STREAM,SOCK_DGRAM等)
SOCK_STREAM表明我們用的是TCP 協議,這樣會提供按順序的,可靠,雙向,連線導向的位元流.
SOCK_DGRAM 表明我們用的是UDP協議,這樣只會提供定長的,不可靠,不需連線的通訊.
protocol:由於我們指定了type,所以這個地方我們一般只要用0來代替就可以了 socket為網路通訊做基本的準備.
成功時返迴文件描述符,失敗時返回-1,看errno可知道出錯的詳細情況.
(二)bind
int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
sockfd:是由socket調用返回的檔案描述符.
addrlen:是sockaddr結構的長度.
my_addr:是一個指向sockaddr的指標. 在中有 sockaddr的定義
struct sockaddr{
unisgned short as_family;
char sa_data[14];
};
不過由於系統的相容性,我們一般不用這個標頭檔,而使用另外一個結構(struct sockaddr_in) 來代替.在中有sockaddr_in的定義
struct sockaddr_in{
unsigned short sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
}
我們主要使用Internet所以
sin_family一般為AF_INET,
sin_addr設定為INADDR_ANY表示可以和任何的主機通訊,
sin_port是我們要監聽的連接埠號碼.sin_zero[8]是用來填充的.
bind將本地的連接埠同socket