MFC網路程式設計

2022-07-18 08:51:18 字數 4263 閱讀 5174

一、概念

1.同步方式與非同步方式

同步方式:傳送方發出資料,等收到接收方發回的響應後,才傳送下乙個資料報的通訊方式

2.阻塞與非阻塞方式

阻塞套接字:執行此套接字的網路呼叫時,直到成功才返回,否則一直阻塞在此網路呼叫上。例如,呼叫receive函式讀取網路緩衝區中的資料,如果沒有資料到達,將一直掛在receive函式呼叫上,直到讀到一些資料,此函式呼叫才返回。

非阻塞套接字:執行此套接字的網路呼叫時,不管是否執行成功,都立即返回。例如,呼叫receive函式讀取網路緩衝區中的資料,不管是否讀到資料都立即返回,而不會一直掛在此函式上。

在實際windows網路通訊軟體開發中,非同步非阻塞套接字是用得最多的。(c/s)就是非同步非阻塞模式。casyncsocket就是乙個非同步類,它封裝了非同步非阻塞socket的基本功能,而casyncsocke的派生類csocket則提供了阻塞的工作方式。

二、socket事件

在實際應用中,程式設計師一般不直接使用casyncsocket類,而是自己定義它的派生類,主要原因就是需要捕獲socket啟用的事件,如socket連線建立,資料接收完畢等。在casyncsocket類中,為響應各種事件,定義了一系列可過載的函式,包括onaccept,onclose,onconnect,onreceive,onsend

事件      響應函式   事件描述

fd_accept  onaccept  通知偵聽套接字,對方程式的連線請求正在等待被接受

fd_close   onclose   連線的另一端應用程式已經關閉它的socket或者連線已丟失,收到此通知的socket應該關閉

fd_connect onconnect 通知連線套接字,對方的連線已經完成,可以通過socket傳送或接收資料       

fd_read   onreceive  表示socket連線的資料已經接收到,可呼叫receive函式接收

fd_write   onsend  表示通過socket已經準備好傳送資料,連線完成即可呼叫此函式

三、socket事件的激發的控制

預設情況下,casyncsocket類會呼叫所有的可過載函式,而csocket乙個也不呼叫。在實際應用中,往往需要控制socket對特定事件函式的呼叫,可採用如下兩種方式實現對這些事件函式激發的控制。

1.通過casyncsocket類的create函式控制

此方法只適合於casyncsocket類及其派生類。在casyncsocket類的create函式中,其第三個引數levent為乙個標誌值,可以指明需要激發哪個事件,其可能取值及要激發的事件如上所示。

bool casyncsocket::create(uint nsocketport=0, int nsockettype = sock_stream,

long levent = fd_ read|fd_ write|fd_oob|fd accept|fd_close|fd_connect,

lpctstr 1pszsocketaddress=null);

2.通過casyncselect函式控制

該方法適用於casyncsocket和csocket的派生類。用組合標記定義激發哪些事件。

呼叫asyncselect函式的典型**可表示如下:

if (m_ sock .asyncselect(fd_ read|fd_ connect)==socket_ error);

else

//成功後的**

預設情況下,asyncselect函式激發所有的事件函式。如果想要關閉所有事件的激發,可以採用如下**:

m_sock.asyncselect(0)

四、socket資訊的獲取與處理

有時,應用程式需要知道socket的狀態資訊,如對方程式的網路位址和埠、socket是否處於阻塞狀態等。

1.獲取socket的位址

當乙個socket與另乙個程式的socket連線後,通過呼叫getpeername函式,獲取連線的程

序的網路位址和埠。getpeername函式的原型如下:

bool getpeername(cstring& rpeeraddress,uint& rpeerport);

兩個引數分別用於記錄連線方的網路位址和埠。

典型的getpeername函式的呼叫方法如下:

cstring saddress;

uint iport;

if(socket_error == m_socket.getpeername(&saddress,&iport))

else

如果採用無連線通訊,可以使用getsocketname函式獲取本方socket的網路位址和埠。其使用方法與getpeername函式相同。

2. socket閉塞處理

使用csocket類時,所有socket通訊函式自動閉塞所有執行緒處理,直到它完成為止。正如有連線通訊例項中見到的,如果呼叫了socket上的connect函式,此函式直到連線完成和socket超時後才能返回執行緒的控制。accept, receive和send函式也是如此。如果需要在函式返回前中斷它們,該如何處理呢?

相比casyncsocket類,csocket類提供了屬性函式isblocking,用來確定乙個阻塞呼叫是否在進行;cancelblockingcall函式,用來取消乙個當前在進行中的阻塞呼叫;過載函式onmessagepending,當等待完成乙個阻塞呼叫時,呼叫此函式來處理懸而未決的訊息。下面對這3個函式進行詳細介紹。

(1).bool csocket::isblocking():如果該套接字是阻塞的,則返回非零值;否則返回o.此成員函式用來確定乙個阻塞的呼叫是否正在進行中。

(2)bool csocket::onmessagepending( ):如果訊息被處理了,則返回非零值;否則返回o.過載這個函式來查詢來自windows的特別訊息,並在套接字中對它們作出響應。這是乙個高階的可過載函式。當套接字在**windows訊息時,框架呼叫onmessagepending來處理應用程式感興趣的訊息。

(3)void csocket::cancelblockingcall( ):此成員函式用來取消乙個當前在進行中的阻塞呼叫。這個函式取消該套接字的任何未完的阻塞操作。

除了accept,取消任何操作都會使該套接字處於一種不確定的狀態。

mfc,tcp_srv網路步驟

1.casyncsocket m_socksend  //宣告乙個傳送套接字

csocket m_socklisten     //宣告乙個監聽套接字

2.m_socklisten.create(m_srvport,sock_stream,0);

3.m_socklisten.bind(m_srvport,m_strsrvaddr);

4.if(m_socklisten.listen())

5.m_socklisten.accept(m_socksend)  //當有連線進入時,才返回

6.int isend = m_socksend.send(szsend,10,0);

mfc,tcp_client步驟

1.csocket m_sockreceive

2.if(m_sockreceive.create())

3.m_sockreceive.connect(m_strsvrip,m_nsvrport);

4.int irecv = m_sockreceive.receive(szrecv,sizeof(szrecv),0);

mfc,udp_srv步驟

1.casyncsocket m_socket

2.m_socket.create.create(m_srvport,sock_dgram,0);

3.m_socket.bind(m_srvport,m_strsrvaddr);

4.int isend = m_socket.sendto(szsend,sizeof(szsend),m_clientport,m_strclientip,0);

mfc,udp_client步驟

1.casyncsocket m_socket

2.m_socket.create(m_clientport,sock_dgram,0);

3.m_socket.bind(m_clientport,m_strclientaddr);

4.int irecv = m_socket.recvfrom(szrecv,sizeof(szrecv),m_srvip,m_strsvrport,0);

MFC網路程式設計學習

網路程式設計人員可以呼叫windows作業系統套接字訪問通訊協議,套接字存在與通訊區域中,windows套接字只支援乙個通訊區域即網際域 af inet 套接字的型別有三類 流式套接字 sock stream 和資料報式套接字 sock dgram 和原始套接字 流式套接字基於tcp協議,資料報式套...

CSocket類網路程式設計 MFC

visual c 的mfc提供了csocket類用來實現網路通訊。下面介紹vc 在windows 95中實現socket的 csocket 類相關成員函式 這些成員函式實際上是從casyncsocket 類繼承來的 的使用。1 bool create uint nsocketport 0,int n...

MFC網路程式設計(二) 簡單TCP通訊

首先建立專案名為 server 和 client 的兩個對話方塊程式,然後分別進行 編寫。1 建立兩個csocket的派生類 class clistensocket public csocket 負責偵聽 class cclientsocket public csocket 負責應答 cptrlis...