Linux Chap7 網路程式設計

2021-10-14 08:25:30 字數 4107 閱讀 7446

tcp:面向連線的傳輸協議、可靠性高、傳輸過程複雜、占用網路資源較多。

udp:不面向連線的傳輸協議、可靠性差、傳輸效率高

socket是一種特殊的i/o介面。

乙個完整的socket有乙個本地唯一的socket號(類似檔案描述符),由作業系統分配。socket是面向客戶/伺服器模型而設計的。網路通訊的程序可通過乙個socket標識。socket可作為一種檔案描述符實施讀寫操作(與正常i/o相同)。主要分為tcp和udp兩種通訊方式,但不限於這兩種方式。

主機位元組序和網路位元組序:不同的cpu有不同的位元組序(整數4bytes在記憶體中儲存的順序),稱為主機位元組序。

網路通訊有統一的位元組傳輸順序,稱為網路位元組序。

大端序:先傳第一位元組0-7bit,依次傳輸(如另一邊為小端序,則把最後乙個收到的放在前面;如為大端序則正常放)

主機序與網路序之間的轉換:(上傳到網路時呼叫hton,網路端到接收端呼叫ntoh,轉換為主機上對應的位元組序)

htons: 把unsigned short型別整數從主機序轉成網路序 host to network short

htonl: 把unsigned long型別整數從主機序轉成網路序

ntohs: 把unsigned short型別整數從網路序轉成主機序

ntohl: 把unsigned long型別整數從網路序轉成主機序

獲得主機名稱:

int gethostname(char *name, int namelen)

用長度為namelen的字元陣列儲存本地主機名

給指定名稱,搜尋獲得主機ip位址資訊

struct hostent *gethostbyname(const char *name)

搜尋/etc/hosts檔案或dns,返回指向hostent結構的指標

#include struct hostent

#include char *inet_ntoa(struct in_addr address)

//將in_addr結構體儲存的32位ipi位址轉換為a.b.c.d格式的ip位址

in_addr_t inet_addr(const char *string)

//將a.b.c.d格式的ip位址轉換為32位ip位址

客戶端/服務端模式(tcp過程)伺服器端:①建立乙個socket,設定相應的socket型別。②繫結某個本地埠,監聽該埠,等待客戶端請求。③接收到客戶端請求,建立乙個新程序(或執行緒)(保證主線程持續監聽埠)處理該請求,原程序繼續監聽。④新程序在服務完成後關閉連線,終止執行。⑤關閉伺服器。

客戶端:①建立乙個socket,設定socket型別。②向伺服器傳送連線請求,連線到伺服器端socket。③連線建立後與伺服器通訊。④關閉連線,終止執行。

tcp程式設計:

建立socket:

標頭檔案:#include#includeint socket(int domain, int type, int protocol);

domain: af_inet ipv4協議

af_inet6 ipv6協議

af_local 域協議

af_route 路由套接字

af_key 金鑰套接字

type: sock_stream 資料流套接字(面向連線的,如tcp)

sock_dgram 資料報文套接字(udp)

sock_raw 原始套接字

protocol: 設為0,表示自動選擇

//domain域:通訊發生在何處,一般為ipv4

//type:用的是tcp還是udp

//type和第三個引數協議有關係,不相符會報錯。

返回值:成功時返回socket描述符;失敗時返回-1

繫結埠bind:

標頭檔案:#includeint bind(int sockfd, struct sockaddr *my_addr, int addrlen);

sockfd: socket函式返回的socket描述符

my_addr: 本地socket資訊,ip位址和埠號等

addrlen: 結構體長度sizeof(struct sockaddr)

返回值:成功時返回0;失敗時返回-1

客戶端請求tcp連線connect:

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);

sockfd: socket函式返回的socket描述符

serv_addr: 遠端服務端的socket資訊,ip位址和埠號等

addrlen:結構體長度sizeof(struct sockaddr)

返回值:成功時返回0;失敗時返回-1

struct sockaddr

#include struct sockaddr_in //ipv4

//必須是網路位元組序

struct in_addr //ipv4位址機構

伺服器端監聽listen:

//為該socket建立乙個輸入資料佇列,儲存服務請求

int listen(int sockfd, int backlog);

backlog: 最大連線數(最多的服務請求(佇列長度))

返回值:成功時返回0,失敗時返回-1

服務端接受客戶端連線請求accept:

int accept(int sockfd, void *addr, int *addrlen);

addr: 存放提出連線請求的客戶機socket資訊

addrlen: sizeof(struct sockaddr_in)

返回值:成功時返回客戶端socket描述符,失敗時返回-1

//服務端呼叫accept進入sleep狀態直到di被連線請求喚醒

傳送資料send:

int send(int sockfd, const void *msg, int len, int flags);

sockfd: 遠端socket描述符

msg: 指向要傳送的資料訊息的指標

len: 資料長度

flags: 一般為0

返回值:成功時返回傳送的位元組數,失敗時返回-1

接收資料recv:

int recv(int sockfd, void *buf, int len, unsigned int flag);

sockfd: 遠端socket描述符

buf: 接收資料緩衝區

返回值:成功時返回接收的位元組數,失敗時返回-1

udp通訊流程:與tcp的區別在於客戶端和服務端不用建立連線。型別是dgram。服務端在bind埠後,就可以接收和傳送資料。客戶端只需要知道服務端的位址和埠就可以傳送和接收資料。

傳送資料sendto:

int sendto(int sockfd, const void *buf, int len, unsigned flags, const struct sockaddr *to, int tolen);

buf: 資料緩衝區的指標

len: sizeof(buf)

flags: 一般為0

to: 接收端網路位址

tolen: sizeof(to)

接收資料recvfrom:

int recvfrom(int sockfd, const void *buf, int len, unsigned flags, const struct sockaddr *from, int fromlen);

from: 傳送端網路位址

39 網路程式設計

http協議,hyper text transfer protocol 超文字傳輸協議 是用於從全球資訊網伺服器傳送超文字到本地瀏覽器的傳輸議,http是乙個應用層協議,由請求和響應構成,是乙個標準的客戶端伺服器模型。c s模式 client和server常常分別處在相距很遠的兩台計算機上,clie...

2018 4 15 網路程式設計

單純的客戶端服務端有個侷限性,a客戶端連線上以後,未處理完之前,b客戶端連線只有等待 所以服務端最好將每個客戶端封裝到乙個執行緒中 class picthread implements runnable public void run outputstream out s.getoutputstre...

013 網路程式設計

ip 位址就是標識網路中裝置的乙個位址,好比現實生活中的家庭位址。ipv4 是目前使用的ip位址 ipv6 是未來使用的ip位址 ipv4 是由點分十進位制組成 ipv6 是由冒號十六進製制組成 ip 位址的作用是標識網路中唯一的一台裝置的,也就是說通過ip位址能夠找到網路中某台裝置。說明 ifco...