socket網路程式設計基礎

2021-10-09 14:47:13 字數 3000 閱讀 8773

伺服器與客戶端

p94-p98先學習基礎

再學習socket程式設計

參考socket,也叫套接字,描述了計算機是ip位址和埠,電腦程式之間採用socket進行通訊。socket把複雜的tcp/ip協議族隱藏在介面後面,方便使用。

tcp提供流和資料報兩種通訊方式,所以套接字也分為流套接字和資料報套接字

流套接字:有序、可靠、雙向的,型別是sock_stream,有錯誤重傳機制(現在用的更多,主要學習)

資料報套接字:不需要建立或者維持連線,採用udp/ip協議,速度快,不可靠

1)指定ip

伺服器可能有多個網絡卡

m_servaddr.sin_addr.s_addr =

inet_addr

("192.168.149.129");

// 指定ip位址

2)任意ip

m_servaddr.sin_addr.s_addr =

htonl

(inaddr_any)

;// 本主機的任意ip位址

m_servaddr.sin_port =

htons

(5000);

// 通訊埠

struct hostent* h;if(

(h =

gethostbyname

("118.89.50.198"))

==0)// 指定服務端的ip位址。

注意即使socket被斷開,send函式也不會立即報錯。

乙個是用於監聽客戶端的socket,還有乙個是客戶端連線成功後由accept建立的用於與客戶端收發報文的的socket

socket是系統資源,作業系統開啟的socket數量是有限的,在程式退出之前必須關閉已開啟的socket,就像關閉檔案指標一樣,就像delete已分配的記憶體一樣,極其重要。

值得注意的是,關閉socket的**不能只在main函式的最後,那是程式執行的理想狀態,還應該在main函式的每個return之前關閉。

函式宣告:

int

socket

(int domain,

int type,

int protocol)

;

domain:協議族,一般填af_inet

type:socket型別,一般填sock_stream

protocol:指定協議,一般為0

函式宣告:

struct hostent *

gethostbyname

(const

char

*name)

;

name:網域名稱或ip位址

返回hostent結構體指標,用於客戶端

int

connect

(int sockfd,

struct sockaddr * serv_addr,

int addrlen)

;

功能:將sockfd對應的socket連線至serv_addr指定的服務端

sockfd:已經建立好的socket對應的id

serv_addr:指定服務端的結構體

addrlen:serv_addr結構體對應的長度

成功返回0,失敗返回-1

int

bind

(int sockfd,

const

struct sockaddr *addr,socklen_t addrlen)

;

功能:服務端用於把通訊的位址和埠繫結到socket上

sockfd:socket對應的id

addr:存放了服務端用於通訊的位址和埠

addrlen:addr結構體的長度

可能出錯的原因:位址無效,或者埠被占用

函式宣告:

int

listen

(int sockfd,

int backlog)

;

sockfd:是已經被繫結的socket對應的id

listen函式把主動連線套接字變為被動連線的套接字,使得這個socket可以接受其它socket的連線請求,從而成為乙個服務端的socket。

int

accept

(int sockfd,

struct sockaddr *addr,socklen_t *addrlen)

;

功能:accept函式等待客戶端的連線,如果沒有客戶端連上來,它就一直等待,這種方式稱之為阻塞,連線成功後建立新的套接字,服務端程式用這個新的套接字和客戶端進行報文的收發

服務端:socket->bind->listen->accept->recv/send->close

客戶端:socket->connect->send/recv->close

網路基礎 Socket程式設計

tpc的服務端要先監聽乙個埠,一般是先呼叫bind函式,給這個soket賦予乙個ip位址和埠。當服務端有了ip和埠號,就可以呼叫listen函式進行監聽。這時候客戶端就可以發起連線了。在作業系統中,為每個socket維護兩個佇列。乙個是已經建立了連線的佇列,三次握手已完畢,處於established...

網路基礎之 網路基礎,socket程式設計

1 什麼是socket 網路基礎 socket 2 為何要學習socket程式設計 基於socket開發乙個c s或者b s結構的軟體 client 網路 server browser 網路 server 3 如何基於socket程式設計 網路 網路是什麼 底層的物理連線介質 網際網路通訊協議 os...

網路基礎與socket程式設計

1.osi七層模型 下 上 物理層 資料鏈路層 網路層 傳輸層 會話層 表示層 應用層 2.tcp ip 五層模型 下 上 1 物理層 乙太網協議 負責光 電訊號的傳遞方式。比如 網線 雙絞線 同軸電纜 光纖 wifi等。物理層的能力決 定了最大傳輸速率 傳輸距離 抗干擾等。工作在物理層的集線器 實...