第四章
基本套接字程式設計
·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...