這周學習了linux網路程式設計相關的知識,現在將其總結如下:
在linux系統中已經將tcp/ip協議相關的東西都封裝好了,所以在入門學習網路程式設計的時候並沒有學習研究太多tcp/ip協議的東西,而是學習那些已經將協議封裝好的函式和api。
在linux網路程式設計中基本幾個函式如下:
第乙個函式:套接字建立函式
該函式功能是建立乙個套接字,各引數含義及函式用法如下
引數_domain表示建立的套接字使用的協議族,其主要取值有:
af_unix:建立乙個只在本機內進行通訊的套接字
af_inet:使用ipv4 tcp/ip協議
af_inet6:使用ipv6 tcp/ip協議
引數_type表示套接字的型別,可以有如下取值:
sock_stream:建立乙個tcp套接字
sock_dgram:建立udp套接字
sock_ram:建立乙個原始套接字
引數_protocol通常設定為0,表示通過引數_domain制定的協議族和引數_type指定的套接字型別來確定使用的協議。當建立原始套接字時,系統無法唯一地確定協議,此時就需要使用該引數指定所使用的協議。
函式執行成功返回新建立的套接字,失敗返回-1,錯誤**存入errno中。
第二個函式:建立連線函式
該函式的功能是在指定的套接字上建立乙個連線。各引數含義及用法如下
引數__fd是由socket()函式建立的乙個套接字,如果該套接字型別是sock_stream,則connect函式用於向伺服器發出連線請求。伺服器的ip位址和埠號由引數__addr引數指定,上圖中__addr所對應的資料型別是const struct socketaddr *。如果套接字型別是sock_dgram則呼叫connect函式並不真正建立連線而只是告訴核心與該套接字進行通訊的目的位址(的第二個引數指定),只有該目標位址發來資料時才會被該socket接收。對於sock_dgram的好處在於不必每次傳送資料時都指定目的位址。__len引數表示第二個位址引數的大小。
該函式在使用時需要注意:如果是tcp常連線選項的話只能夠呼叫一次connect函式建立連線,而對於無連線的udp來說可以多次呼叫該函式來改變傳送資料的目標位址。
第三個函式:繫結埠函式
該函式是將乙個埠繫結在某個套接字上,這個函式常用在伺服器端。其中__fd表示要繫結的套接字描述符,__addr表示要繫結的ip,__len表示要繫結的ip長度,一般用sizeof計算。
第四個函式:監聽函式
該函式是將乙個套接字轉化為監聽套接字,常用於伺服器端監聽來自客戶端的連線請求。第乙個引數__fd表示監聽套接字描述符,第二個引數表示最大監聽的個數。
第五個函式:接受連線函式
這個函式的功能是接收來自監聽套接字上的請求,__fd是乙個監聽套接字,__addr用來儲存發起連線的主機的埠號和ip,與上兩個函式中的__addr型別相同,__addr_len是__addr所指向的長度,一般使用sizeof計算達到。
該函式返回乙個套接字,返回的套接字就是和客戶端建立連線的客戶端。
第六個函式:傳送資料函式
建立連線的目的就是傳送資料,linux中傳送資料提供了兩個函式,乙個用於使用tcp來傳送資料,乙個使用udp傳送資料,這裡總結tcp傳送資料的函式,因為udp傳送資料的函式和tcp的int sendto(int __fd, const void *__buf, size_t __n, int __flags, __const_sockaddr_arg __addr, socklen_t __addr_len)只是多了傳送的目標id和目標id的長度。
該函式是使用tcp傳送資料,__fd表示建立起連線的套接字(accept函式返回的套接字而非listen函式中的套接字),
msg_oob:在指定套接字上傳送帶外資料(所謂帶外資料就是指連線雙方中的一方發生重要的事情,想要迅速通知對方,這種通知在已排隊等待的任何「普通」資料之前傳送。帶外資料的傳送優先順序更高,帶外資料是對映進現有連線中而不需要重新連線)
msg_dontroute:通過最直接路徑傳送資料,而忽略下層協議的路由設定。
第七個函式:接收資料
linux中提供了tcp接收函式和既能接收tcp又能接收udp資料的接收函式。
兩者都能接收的函式為:
該函式的__fd引數表示連線套接字,__restrict __buf表示接收快取區,__n表示接收快取區的大小,__flags一般為0其餘取值如下:
msg_oob:在指定套接字上傳送帶外資料
msg_peek:之檢視資料而不讀出資料
msg_waitall:只在接收資料快取區滿的時候才返回。
如果該函式的__addr非空則表示不是面向連線的,__addr_len在呼叫前表示__addr的長度,呼叫後將表示__addr的實際大小。
只能接收tcp的函式為:
extern ssize_t recv (int __fd, void *__buf, size_t __n, int __flags);該函式只能用於常連線,函式的引數和上邊那個函式差不多,少了最後兩個引數。
打個比方來理解這些函式的工作吧,伺服器就相當於公司的老闆(boss),客戶端相當於公司的員工,bind函式相當於給老闆分配乙個辦公室,listen函式表示老闆在辦公室坐在窗邊喝著茶等著員工來找他辦事,connect函式表示員工主動去找老闆談加工資的事情,accept函式相當於老闆將談工資這個事情分配給了管工資的小老闆,然後員工(客戶端套接字描述符)和小老闆(accept函式返回的套接字)開始了談工資的工作,而接收函式和傳送函式乙個可以看成說話乙個可以看成聽話。
linux 網路程式設計與 windows 網路程式設計
最近寫了乙個程式,涉及到在windows下執行的乙個程式到執行在linux下的伺服器取出資料。一開始還真沒有適應過來。下面說說我遇見的一些問題。1 windows下connect不成功。最開始也是不清楚 出錯,程式莫名其妙就在這個connect斷下,而且會花費很長的時間在connect這一句停留很長...
總結之linux下網路程式設計
1.有一篇好的文章,對linux下socket程式設計的原理和要點說的很清楚 2.一些windows網路程式設計的要點吧。包括大頭序,小頭序,網路位元組序。一些常用的函式等。3.linux網路程式設計 宋斌寫的,這本書不錯。寫的清楚,容易懂。是乙個比較好的參考資料。粗看了看,有不少收益。4.linu...
linux網路程式設計學習筆記 select程式設計
網路上常見的一張tcp狀態轉換圖,實線是主動端,虛線是被動端 關於select用法 include according to earlier standards include include include int select int nfds,fd set readfds,fd set wri...