說明
網路上的ip都是數字加點(192.168
.0.1)構成
struct in_addr結構使用32位的ip,如
ip(c0a80001)是192.168
.0.1
函式原型
int inet_aton(const
char *cp, struct in_addr *inp)
將a.b.c.d的ip轉換為32位的ip,儲存在 inp指標裡面
char *inet_ntoa(struct in_addr in)
將32位ip轉換為a.b.c.d的格式
說明a代表 ascii,n代表network
伺服器程式作用
初始化伺服器程式
持續監聽乙個固定的埠
收到客戶的連線後建立乙個socket連線
與客戶進行通訊和資訊處理
接收客戶通過socket連線傳送來的資料,建立乙個新的socket,
通過socket連線與客戶通訊,進行相應處理,並返回處理結果
通訊結束後中斷與客戶的連線(關閉socket)
客戶程式作用
初始化客戶程式
連線到某個伺服器上,建立socket連線
與伺服器進行通訊和資訊處理
接收伺服器通過socket連線傳送來的資料,進行相應處理
通過socket連線向伺服器傳送請求資訊
通訊結束後中斷與客戶的連線
udp實現框架
沒有乙個客戶端可以一直占用服務端
只要處理過程不是死迴圈,則伺服器對於每乙個客戶機的請求總是能夠滿足
socket(...);
bind(...);
while(1)
tcp實現框架
每次接受乙個客戶端連線
完成某客戶所有請求後,斷開連線
socket(...);
bind(...);
listen(...);
while(1)
close(...);
}
tcp實現框架
s = socket(...);
bind(s, ...);
listen(s, ...);
while(1)
} }
功能描述
客戶端
使用執行緒向伺服器傳送從標準輸入得到的字元
在主線程中將從伺服器端返回的字元顯示到標準輸出
伺服器端
將客戶端發來的資料原樣返回給客戶端,每乙個客戶在伺服器上對應乙個執行緒
多路復用i/o
工作機理
程序可在多個socket上等待網路事件,當某個socket發生網路事件時,使用者可通過檢視網路事件對該socket事件進行i/o操作
要求應用程式不斷向核心寫入socket描述符,核心還應不斷掃瞄socket集來檢測狀態
實現途徑
預先構造一張描述符表,隨後通過select()選擇乙個已準備好的描述符並返回
應用場景
乙個程序中有多個客戶連線(存在多個tcp 套接字描述符),select()函式阻塞直到任何乙個描述符被啟用
避免程序為等待乙個已連線上的資料而無法處理其他連線
int
select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
nfds:所有被監控檔案描述符中最大的乙個加1
readfds:所有要讀的檔案檔案描述符的集合
writefds:所有要寫的檔案檔案描述符的集合
exceptfds:其他需要向我們通知的檔案描述符
timeout:超時設定
執行機制
select呼叫程序一直阻塞直到以下情況之一發生
有檔案可以讀
有檔案可以寫
超時所設定的時間到
返回結果
-1:表明函式呼叫發生錯誤,錯誤號存放在errno變數中
0:表明發生超時而沒有發生其他的錯誤
大於0:表明事件發生的檔案描述符的數目
void fd_set(int fd, fd_set *fdset)
將fd加入到fdset
void fd_clr(int fd, fd_set *fdset)
將fd從fdset裡面清除
void fd_zero(fd_set *fdset)
從fdset中清除所有的檔案描述符
int fd_isset(int fd, fd_set *fdset)
判斷fd是否在fdset集合中
功能
更多的靈活性,可編寫tcp/udp套接字不能實現的功能
可由使用者自己建立各個頭部
只能由有root許可權的使用者建立
函式原型
int sockfd(af_inet, sock_raw, protocol)
根據protocol(如ipproto_icmp, ipproto_tcp, ipproto_udp)建立不同型別原始套接字
Linux下經常使用的C C 開源Socket庫
1.linux socket programming in c 2.ace ace採用ace os適配層遮蔽各種不同的 複雜繁瑣的作業系統api。ace是乙個大型的中介軟體產品,20萬行左右,過於巨集大,一堆的設計模式,架構了一層又一層。它龐大 複雜。適合大型專案。開源 免費。不依賴第三方庫。使用的...
Linux下 面向連線的 UDP通訊
1 編寫udp server程式的步驟 1 使用socket 來建立乙個udp socket,第二個引數為sock dgram。2 初始化sockaddr in結構的變數,並賦值 這裡使用 2030 作為服務程式的埠,使用 inaddr any 作為繫結的ip位址即任何主機上的位址。3 使用bind...
linux下安裝gd庫並且支援socket
gd 2.0.33.tar.gz jpegsrc.v6b.tar.gz libpng 1.2.7.tar.tar zlib 1.2.2.tar.gz freetype 2.1.9.tar.gz php 4.3.9.tar.gz 二 安裝 1.安裝zlib tar zxvf zlib 1.2.2.ta...