什麼是套接字:
套接字是一種通訊過程,它使客戶/伺服器系統的開發工作既可以在本地單機上進行,也可以跨網路進行。
套接字建立過程:
1,建立乙個套接字,這是分配給該伺服器程序的乙個作業系統資源,套接字由伺服器通過系統呼叫socket建立出來的,所以其它程序將不能對它進行訪問。
2,給套接字起個名字,用系統呼叫bind,然後伺服器就開始等待有客戶連線到這個命名套接字上來。系統呼叫listen建立乙個佇列,來自客戶的連線將在這個佇列上排隊等
待伺服器的處理,伺服器將通過系統呼叫accept來接受來自客戶的接入連線。
3,當伺服器呼叫accept的時候,會新建立乙個套接字,新套接字的唯一用途就是與這
個特定的客戶進行通訊,而命名套接字則被解放出來,準備處理來自其它客戶的連線。
客戶端:
先通過呼叫socket建立乙個未命名的套接字,然後呼叫connect利用伺服器的命名套接
字和乙個位址來建立乙個連線。
套接字建立後,可以像操作底層檔案描敘符一樣用它來實現資料通訊。
乙個簡單的伺服器端:
#include
#include
#include
#include
#include
int main()}
乙個簡單的客戶端:
#include
#include
#include
#include
#include
int main()
///讀寫操作///
write(sockfd,&ch,1);
read(sockfd,&ch,1);
printf("char from server = %c/n",ch);
close(sockfd);
exit(0);
}詳細說明:
建立乙個套接字:
#include
#include
int socket(int domain,int type ,int protocol);
建立出來的套接字是一條通訊線路的乙個端點。domain引數負責指定位址族,type引數負責指定與這個套接字一起使用的通訊型別,而portocol引數負責指定所使用的協議。
type:指定了與新套接字對應的通訊特性。它的取值包括sock_stream和sock_dgram。
sock_stream是乙個有序的,可靠的,基於連線的雙向位元組流。tcp協議
sock_dgram是乙個資料圖服務。無保證的連線,對於af_inet域使用udp協議
protocol:通訊所用的協議通常是由套接字的型別和套接字的域來決定的,一般不再有可挑選的餘地,如果還能挑選,就需要用到protocol引數,0選擇預設的協議。
socket系統呼叫返回的是乙個描敘符,它在許多方面類似於乙個底層的檔案描敘符。
給套接字起名字:
#include
int bind(int sockfd, const struct sockaddr *address,size_t address_len);
作用:把引數address中給出的位址賦值給與檔案描敘符socket相關聯的未命名的套接字。位址結構的長度是通過address_len引數傳遞的。
建立套接字佇列:
#include
int listen(int socket,int backlog);
backlog為最大佇列長度,常用的值是5;
接受連線:
#include
int accept(int socket,struct sockaddr * address,size_t *address_len);
accept呼叫會等到有客戶程式試圖連線到由socket引數指定的套接字時才返回。該客戶就是排在佇列第一位的連線。accept函式將建立出乙個新的套接字來與客戶進行通訊,返回的是與之對應的檔案描敘符。新套接字的型別與伺服器監聽套接字的型別是一樣的。
請求連連:
#include
int connect(int socket,const sockaddr *address,size_t address_len);
引數socket指定的套接字將連線到引數address指定的伺服器套接字上去。
關閉套接字int close ( int socket);
select呼叫:
#include
#include
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds,struct timeval *timeout);
select呼叫的作用是檢查那個檔案描敘符集合裡是否有乙個檔案描敘符處於讀操作就緒狀態,寫操作就緒或有個錯誤排隊的狀態,如果沒有,就阻塞到這些狀態有乙個出現為止。
nfds引數給出了需要進行測試的檔案描敘符個數,測試將對第0到第(nfds-1)個描述符進行。三個描述符集合都可以是乙個空指標,這表示不進行相應的測試。
SOCKET程式設計(LINUX)
現在的網路程式設計幾乎都是用的socket 本地的程序間通訊 ipc 有很多種方式,但可以總結為下面4類 2.我們要討論的是網路中程序之間如何通訊?在本地可以通過程序pid來唯一標識乙個程序,但是在網路中這是行不通的。三元組 ip位址,協議,埠 就可以標識網路的程序了,網路中的程序通訊就可以利用這個...
Linux程式設計基礎 Socket程式設計
linux下的socket程式設計大體上包括tcp socket udp socket即raw socket這三種,其中tcp和udp方式的socket程式設計用於編寫應用層的socket程式,是我們用得比較多的,而raw socket則用得相對較少,不在本文介紹範圍之列。tcp socket 基於...
Linux網路程式設計 socket程式設計
套接字是在進行網路連線時最重要的部分之一!套接字socket就相當於是,乙個檔案操作符,不佔空間。但是這個套接字對應這兩個緩衝區 傳送端緩衝區和接收端緩衝區,如下圖所示。兩個套接字的連線就是通過ip和埠。1.3.1 ip轉換函式 其一,該函式比較常用,在linux幫助手冊的第11章 標頭檔案 inc...