Linux網路程式設計讀書筆記 4

2021-03-31 11:21:31 字數 4244 閱讀 6649

第四章

基本套接字程式設計

·4.1

基本套接字函式族

標頭檔案:

, 主要函式:

int socket(int domain, int type, int protocol);//

建立socket

描述符[domain=af_unix,af_i***,af_iso; type=sock_stream,sock_dgram,sock_raw;]

int connect(int sockfd, struct sockaddr* servaddr, int addrlen);//

向伺服器傳送連線請求

int bind(int sockfd, struct sockaddr* myaddr, int addrlen);//

向系統登記乙個固定埠

int listen(int sockfd, int backlog);

//被動傾聽套接字的指定埠

int accept(int sockfd, struct sockaddr* addr, int addrlen);//

從完全連線佇列接收乙個連線套接

[如果完全連線隊列為空佇列則堵塞,或直接返回-1,

accept

成功返回乙個(繼承傾聽套接字屬性的)連線套接字描述符

]int close(int sockfd);

//關閉套接字描述符

int shutdown(int sockfd, int howto);

//關閉套接字描述符讀寫通道

[howto = shut_rd, shut_wr, shut_rdwr]

網路字序轉換函式族:

標頭檔案:

unsigned long int htonl(unsigned long int hostlong);//host to ***work long

字序轉換

unsigned long int htons(unsigned long int hostlong);//host to ***work short

字序轉換

unsigned long int ntohl(unsigned long int hostlong);//***work to host long

字序轉換

unsigned long int ntohs(unsigned long int hostlong);//***work to host short

字序轉換

ip位址轉換函式族

標頭檔案:

, ,

主要函式:

int i***_aton(const char *cp, struct in_addr *inp);//

將字串表示

ip位址轉

struct in_addr

表示unsigned long int i***_addr(const char *cp);//

將字串表示

ip位址轉

32 bits

表示char *i***_ntoa(struct in_addr in);//將

struct in_addr

表示ip

位址轉字串表示

示例**:

listen_fd = socket(af_i***, sock_stream, 0);//

建立inter***

協議簇,流型別套接字

if (listen_fd == -1) error_proc();

bzero(&serv_addr, sizeof(serv_addr)); //

初始化伺服器位址結構

serv_addr.sin_family = af_i***;//

使用inter***

協議簇serv_addr.sin_port = htons(

埠號);//

設定埠號,並轉換為網路字序

/*如果是客戶端執行

*ret = i***_aton(「127.0.

0.1」

, &serv_addr.sin_addr); //

為socketaddr

位址結構設定

ip位址*然後

bind();

指定埠,接著

connect();

伺服器端請求建立連線,開始「三次握手」協議

*如果是伺服器端則執行

*/serv_addr.sinaddr.s_addr = htonl(inaddr_any); //

允許任何網路裝置介面連線並處理

ret = bind(listen_fd, (struct sockaddr*)&serv_addr,sizeof(serv_addr));//

套接字繫結指定埠

if (ret < 0) error_proc();

listen(listen_fd,

傾聽佇列長度

);//

轉為傾聽套接字,設定傾聽佇列長度

//從完全連線佇列中接受乙個新連線,返回連線套接字描述符

conn_fd = accept(listen_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

·併發伺服器模式

/*0

伺服器端套接字初始化,

1伺服器端的父程序用傾聽套接字

x,傾聽來自客戶端的請求連線,2當

accept

乙個連線套接字y時候

fork

子程序專門處理客戶端的資料處理,

3子程序關閉傾聽套接字

x不使用,處理客戶端請求,完畢後關閉

y,退出,

4而父程序關閉連線套接字描述符

y不使用,繼續傾聽新的客戶端連線

(轉過程2)。

*/do

} while (continue);

示例**:

listen_fd = socket(af_i***, sock_stream, 0);//

建立inter***

協議簇,流型別套接字

if (listen_fd == -1) error_proc();

bzero(&serv_addr, sizeof(serv_addr)); //

初始化伺服器位址結構

serv_addr.sin_family = af_i***;//

使用inter***

協議簇serv_addr.sin_port = htons(

埠號);//

設定埠號,並轉換為網路字序

/*如果是客戶端執行

*ret = i***_aton(「127.0.

0.1」

, &serv_addr.sin_addr); //

為socketaddr

位址結構設定

ip位址*然後

bind();

指定埠,接著

connect();

伺服器端請求建立連線,開始「三次握手」協議

*如果是伺服器端則執行

*/serv_addr.sinaddr.s_addr = htonl(inaddr_any); //

允許任何網路裝置介面連線並處理

ret = bind(listen_fd, (struct sockaddr*)&serv_addr,sizeof(serv_addr));//

套接字繫結指定埠

if (ret < 0) error_proc();

listen(listen_fd,

傾聽佇列長度

);//

轉為傾聽套接字,設定傾聽佇列長度

//從完全連線佇列中接受乙個新連線,返回連線套接字描述符

conn_fd = accept(listen_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

·併發伺服器模式

/*0

伺服器端套接字初始化,

1伺服器端的父程序用傾聽套接字

x,傾聽來自客戶端的請求連線,2當

accept

乙個連線套接字y時候

fork

子程序專門處理客戶端的資料處理,

3子程序關閉傾聽套接字

x不使用,處理客戶端請求,完畢後關閉

y,退出,

4而父程序關閉連線套接字描述符

y不使用,繼續傾聽新的客戶端連線

(轉過程2)。

*/do

} while (continue);

《Linux網路程式設計》讀書筆記

去年買了 linux網路程式設計 這本,沒想到一放就是半年的時間了,慚愧啊!當年的雄心壯志都去哪了 好,廢話不多說,從今天開始,每天積累一點,厚積才能薄發,磨刀不誤砍柴工。工資趕快漲 漲 1991年,linux開始誕生了,到2011年,linux的版本從2.6直接蹦到了3.0,據說這個沒什麼大意義,...

Linux網路程式設計讀書筆記 7

第九章高階套接字函式程式設計 9.1 傳送和接收函式的高階用法 標頭檔案 int send int sockfd,void buf,int len,int flags flags msg oob,msg dontwait,msg dontroute int recv int sockfd,void ...

Linux網路程式設計讀書筆記 8

第十一章 資料結構的傳輸和 xdr標準 11.1 資料結構的傳送 網路資料結構傳遞可能存在以下問題 網路字序問題 浮點數傳輸 指標處理 自定義手工處理方式 將待傳送資料結構轉換以後放入應用的傳送緩衝區 將應用的接收緩衝區中資料結構轉換以後再進行資料處理。示例 void send int32 2buf...