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...