一 點睛
linux網路程式設計包括:使用者態網路程式設計和核心態網路程式設計。
無論在windows平台還是linux平台,都對套接字實現了自己的一套程式設計介面。windows下的socket實現叫windows socket。linux下的實現有兩套:一套是伯克利套介面,起源於berkeley unix,這套介面很簡單,得到了廣泛應用,已經成為linux網路程式設計事實上的標準;另一套是傳輸層介面,它是system v系統上網路程式設計api,所以這套程式設計介面更多是在unix上使用。
socket是在應用層和傳輸層之間的乙個抽象層,它把tcp/ip層複雜的操作抽象為幾個簡單的介面**用層呼叫,以實現程序在網路中通訊。
socket程式設計介面其實就是使用者程序(應用層)和傳輸層或網路層之間的程式設計介面。
二 網路程式架構
基於套接字的網路程式設計,通常使用c/s架構。乙個簡單的客戶機和伺服器之間的通訊過程如下:
1 客戶機向伺服器提出乙個請求。
2 伺服器收到客戶機的請求,進行分析處理。
3 伺服器將處理的結果返回客戶機。
三 套接字型別
linux下有3種型別套接字
原始套接字與標準套接字(標準套接字包括流套接字和資料報套接字)的區別:原始套接字可以讀寫核心沒有處理的ip資料報,而流套接字只能讀取tcp協議的資料,資料報套接字只能讀取udp協議的資料。
四 套接字位址結構
1 點睛
af 表示address family 位址族,pf 表示protocol family 協議族,但這兩個巨集定義是一樣的,所以使用哪個都沒有關係。
winsock2.h中#define af_inet 2,#define pf_inet af_inet,所以在windows中af_inet與pf_inet完全一樣。
而在unix/linux系統中,在不同的版本中這兩者有微小差別。
對於bsd,是af。
對於posix是pf。
unix系統支援af_inet,af_unix,af_ns等
而dos,windows中僅支援af_inet,它是網際網區域。
不同協議族的套接字位址的含義是不同的,如af_inet的位址為struct sockaddr_in,
而域套接字af_inet的位址為struct sockaddr_un
2 sockaddr_in說明
sockaddr_in定義位置:/usr/include/netinet/in.h
struct sockaddr_in
;
__sockaddr_common是乙個巨集,定義在/usr/include/bits/sockaddr.h
#define __sockaddr_common(sa_prefix) \
sa_family_t sa_prefix##family
\:續行符
##:連線前後兩個引數
__sockaddr_common (sin_);
巨集展開後變為:
sa_family_t sin_family
sa_family_t定義於/usr/include/bits/sockaddr.h
typedef unsigned short int sa_family_t;
所以__sockaddr_common (sin_);巨集展開後的最終結果是:unsigned short int sin_family
五 主機位元組序
1 點睛
2 測試主機的位元組序
2.1 **
#include using namespace std;
int main(int argc, char *ar**)
2.2 執行
[root@localhost test]# g++ -o test test.cpp
[root@localhost test]# ./test
this machine is small endian.
2.3 說明
這個機子是x86機子,x86機子基本都是小端模式。
六 網路位元組序
1 點睛
網路位元組序是tcp/ip中規定好的一種資料表示格式,它與具體的cpu型別,作業系統無關,從而可以保證資料在不同主機之間傳輸時能夠被正確解釋。網路位元組順序採用大端排序方式。
我們開發應用程式時,應該保證使用網路位元組序,為此需要將資料由主機的位元組序轉換為網路位元組序後再發出資料,接收方收到資料也要先轉為主機位元組序後再進行處理。
2 主機位元組序和網路位元組序相互轉換的函式。
uint32_t htonl(uint32_t hostlong); //32位主機轉網路
uint16_t htons(uint16_t hostshort); //16位主機轉網路
uint32_t ntohl(uint32_t netlong); //32位網路轉主機
uint16_t ntohs(uint16_t netshort); //16位網路轉主機
C 基礎知識介紹
c幾乎是c 的乙個子集,c語言支援的語法在c 中基本都支援並需要使用。內建型別 語言內部已定義的基本型別 自定義型別 自己用struct class enum union等定義的就是自定義型別 名字空間域相當於乙個全域性域,用花括號把檔案的一部分括起來,並以關鍵字namespace開頭給它起乙個名字...
WINSOCK基礎知識(套接字描述符)
引子.大多數的作業系統裡,需要i o請求的應用程式請求作業系統開啟乙個檔案。系統就建立乙個檔案描述符提供給應用程式訪問檔案。從應用程式的角度看,檔案描述符是乙個整數,應用程式可以用它來讀寫檔案。下圖顯示,作業系統如何把檔案描述符實現為乙個指標陣列,這些指標指向內部資料結構。對於每個程式系統都有一張單...
C 套接字程式設計
1.ipendpoint c 裡ip 埠對應的是ipendpoint 先看下如何得到ipendpoint,其中乙個建構函式如下 public ipendpoint ipaddress address,int port 這裡第乙個引數要求是個ipaddress型別的,先看看如果獲取ipaddress型...