使用VC 的網路程式設計總結

2021-10-26 04:06:22 字數 4287 閱讀 3548

1.套接字程式設計原理

1.1 client/server通訊模型

1.2 windows sockets規範

1.3 套接字

1.3.1 套接字定義

1.3.2分類

1.3.3 套接字的作用

1.3.4埠與位址

1.3.5 套介面屬性

2.基本的windows sockets api程式設計

2.1常用函式

2.2 tcp例項

2.3 udp例項

2.4 socket 通訊阻塞的解決方法

3.mfc下的socket程式設計的類

3.1 casyncsocket類

3.2 csocket類

3.3 windows sockets:帶存檔的套接字的工作方式

3.4 流式套接字通訊的操作順序

3.5 使用 casyncsocket 類

3.6 從套接字類派生

3.7 套接字通知

3.8 乙個使用csocket類的網路通訊例項

3.8.1 伺服器端應用程式設計(serverdemo)

3.8.2 客戶端應用程式設計(專案名稱clientdemo)

4.套接字的託管實現

4.1 system::net::sockets 命名空間

4.2 例項:乙個新郵件檢查器

5. 怎樣實現伺服器端多執行緒的socket功能?

1.套接字程式設計原理

乙個完整的網間通訊程序需要由兩個程序組成,並且只能用同一種高層協議。也就是說,不可能通訊的一端用tcp,而另一端用udp。乙個完整的網路信需要乙個五元組來標識:

協議、本地位址、本地埠號、遠端位址、遠端埠號。

1.1 client/server通訊模型

在客戶/伺服器模式中我們將請求服務的一方稱為客戶(client),將提供某種服務的一方稱為伺服器(server)。

乙個服務程式通常在乙個眾所周知的位址監聽對服務的請求,也就是說服務程序一直處於休眠狀態,直到乙個客戶對這個服務的位址提出了連線請求。在這個時刻,服務程式被「驚醒」並且為客戶提供服務—對客戶的請求作出適當的反應。雖然基於連線的服務是設計客戶機/伺服器應用程式時的標準,但有些服務也是可以通過無連線的介面提供的。

客戶機/伺服器的請求/響應過程示意圖如下所示。

圖1 客戶/伺服器通訊模型

通過上面的分析,我們不難理解乙個乙個完整的網路應用程式包括客戶端和伺服器兩個部分。客戶與伺服器程序的作用是非對稱的,因此編碼不同。服務程序一般是等待客戶請求而啟動的,只要系統執行,該服務程序一直存在,直到終止或強迫終止。

1.2 windows sockets規範

windows sockets 。它以u.c.

berkeley大學bsd unix中流行的socket介面為基礎,主要在其上擴充了一組針對windows的擴充套件庫函式,增加了符合windows訊息驅動特性的網路事件非同步選擇機制,以使程式設計師能夠充分利用windows訊息驅動機制進行程式設計。

windows sockets 的用途是將基礎網路抽象出來,這樣,您不必對網路非常了解,並且您的應用程式可在任何支援套接字的網路上執行。它為應用程式開發者定義了一套簡單統一的api,並讓各家網路軟體**商共同遵守。

windows sockets規範從90年代初的1.0版本開始,經過不斷的完善和發展,目前已經有了windows sockets 2版本。值得注意的是,microsoft的mfc庫現在只支援windows sockets 1版本,不支援windows sockets 2版本。

mfc提供了兩個類用以封裝windows sockets api。乙個是casyncsocket類,它主要是提供給那些具有一定網路程式設計經驗,希望同時擁有socket api程式設計的靈活性和類庫程式設計便利性的開發者的。另乙個是csocket類,它由casyncsocket類派生,它具有更高的抽象化,致力於簡化網路程式設計所需的操作。

1.3 套接字

1.3.1 套接字定義

套接字是乙個通訊終結點,它是sockets 應用程式用來在網路上傳送或接收資料報的物件。套接字具有型別,與正在執行的程序相關聯,並且可以有名稱。目前,套接字一般只與使用網際協議組的同一「通訊域」中的其他套接字交換資料。

使用套接字的應用程式間通訊模型如圖2所示。

1.3.2分類

可用的套接字型別有以下兩種:

1.3.2.1流式套接字

流式套接字提供沒有記錄邊界的資料流,即位元組流。位元組流能確保以正確的順序無重複地被送達。

1.3.2.2 資料報套接字

資料報套接字支援面向記錄的資料流,但不能確保能被送達,也無法確保按照傳送順序或不重複。

「有序」指資料報按傳送的順序送達。「不重複」指乙個特定的資料報只能獲取一次。這兩種套接字都是雙向的,是可以同時在兩個方向上(全雙工)進行通訊的資料流。

注意在某些網路協議下(如 xns),流可以面向記錄,即作為記錄流而非位元組流。但在更常用的 tcp/ip 協議下,流為位元組流。windows sockets 提供與基礎協議無關的抽象化級別。

1.3.3 套接字的作用

套接字的作用非常大,至少在下面三種通訊上下文中如此:

● 客戶端/伺服器模型。

● 對等網路方案,如聊天應用程式。

● 通過讓接收應用程式將訊息解釋為函式呼叫來進行遠端過程呼叫 (rpc)。

1.3.4埠與位址

在網路上,乙個套接字的標識主要借助於位址和埠來描述。

套接字的位址指該套接字所在計算機的網路位址,可以為網域名稱或ip位址的形式。通常,建立套接字時不必指明網路位址,只有在擁有多個網路位址的機器時,才需要顯式指定乙個網路位址。

同一機器上可以執行多個網路應用程式,每個應用程式都有自己的套接字用以進行網路通訊,此時如果只有位址標識套接字,則當乙個通訊包到達機器時,將無法確定究竟是哪個應用程式的套接字需要接收此資訊。由此增加了埠的概念,以協助區分同一機器上不同應用程式的套接字。

埠用於標識程序,同一機器上不同的網路應用程式各有不同的埠,這樣,通過「網路位址+埠號」的標識方法,便唯一標識了機器上的應用程式了。

某些埠是專門為公共服務保留的(ftp:21,http:80),除非程式是要提供這些服務,否則應盡量避免使用這些埠。

一般來說,埠1024以前的埠號都是系統保留的或是作為公共服務的,應盡量選擇大於1024的埠號,以避免衝突。

1.3.5 套介面屬性

套介面有一系列的屬性用於標識套介面的狀態等資訊,它們的屬性如表1所示。

表1 套介面屬性

可以通過getsockopt()函式獲取套介面的屬性,也可以通過setsockopt()函式設定套介面的屬性。

2. 基本的windows sockets api程式設計

● 需要在程式中新增下面的包含語句:#include

● 使用vc++編譯時需新增編譯鏈結依賴項ws2_32.lib庫

● 協議定址

在winsock中,應用程式通過sockaddr_in 結構來指定ip位址和服務埠資訊

sockaddr_in internetaddr;

int nportid=5320;

internetaddr.sin_family=af_inet;

internet.sin_addr.s_addr=inet_addr(「202.202.42.88」); //inaddr_any

internet.sin_port=htons(nportid);

ip位址不容易記憶,還提供了許多位址和名稱解析函式如gethostbyname,gethostbyaddr等。

2.1常用函式

1)wsastartup 呼叫windows socket dll

函式原型 int wsastartup(

word wversionrequested, //應用程式要求的sockets版本

lpwsadata lpwsadata //指向資料結構wsdata的指標,

得到windows socket的具體資訊

);wsdata定義如下:

typedef struct wsadata {

wordwversion;

wordwhighversion;

#ifdef _win64

unsigned shortimaxsockets;

unsigned shortimaxudpdg;

char farlpvendorinfo;

charszdescription[wsadescription_len+1];

charszsystemstatus[wsasys_status_len+1];

#else

charszdescription[wsadescription_len+1];

charszsystemstatus[wsasys_status_len+1];

VC高階程式設計總結 1

018 在靜態控制項上畫座標和圖 10 019 動態庫程式的編寫 11 020 動態連線庫的載入 12 021 自定義訊息的實現 12 022 執行緒的啟動 無引數 13 023 執行緒的啟動 有引數 13 024 多執行緒畫線的操作 14 025 檔案的開啟 讀寫 關閉 15 026 檔案的塊讀寫...

04VC60上機指導程式設計C課程的實驗環境

vc 6.0是microsoft公司出品的基於windows環境的c c 開發工具,它是microsoft visual stdio套裝軟體的乙個組成部分。c源程式可以在vc 6.0整合環境中進行編譯 連線和執行。1 vc 6.0主視窗 從visual stdio的光碟中執行vc 6.0安裝程式 s...

別人總結的vc快捷鍵

df最近開始用vc2008了,感覺很陌生,為了更快地程式設計,需要快速熟悉開發環境,下面為網上整理的快捷鍵 個人感覺比較常用 ctrl f7 生成編譯ctrl o 開啟檔案ctrl shift o開啟專案 ctrl j 列出成員智慧型感知shift delete整行刪除,並且將這一行放到剪貼簿 這時...