MFC套接字程式設計

2021-07-02 02:28:42 字數 4815 閱讀 8658

為了降低網路程式開發的難度,提高程式開發效率,mfc對套接字函式進行了封裝,提供了casyncsocket類和csocket類用於網路程式開發。

casyncsocket類用於對套接字函式進行簡單封裝,它提供了基於事件的i/o非同步模型,使得使用者可以方便地處理接收和傳送等事件。但是,使用者需要自己處理網路的位元組順序、不同字符集間的轉換問題等。

casyncsocket類的主要方法、事件如下:

(1)create方法

該方法用於建立乙個windows套接字,並將其附加到casyncsocket類物件上。

語法:bool create(uint nsocketport = 0,int nsockettype = sock_stream,long levent = fd_read | fd_write |

fd_oob | fd_accept | fd_connect | fd_close, lpctstr lpszsocketaddress = null)

nsocketport 表示套接字埠,如果為0,系統將自動選擇乙個埠

nsockettype表示套接字的型別,如果為sock_stream,表示流式套接字;為sock_dgram,表示資料報套接字

levent 表示套接字能夠處理的網路事件,其值可以是表20.18描述的任意值的組合

lpszsocketaddress 表示套接字的ip位址

fd_read 當套接字中有資料需要讀取時觸發事件

fd_write 當向套接字寫入資料時觸發事件

fd_oob 當接收到帶外資料時觸發事件

fd_accept 當接收到連線請求時觸發事件

fd_connect 當連線完成時觸發事件

fd_close 當套接字關閉時觸發事件

(2)getlasterror方法

該方法用於獲取最後一次操作失敗的狀態資訊。

語法:static int getlasterror( );

返回值:返回錯誤編號。

(3)getpeername方法

該方法用於獲取套接字連線的ip位址資訊。

語法:bool getpeername( cstring& rpeeraddress, uint& rpeerport );

bool getpeername( sockaddr* lpsockaddr, int* lpsockaddrlen );

rpeeraddress 用於接收函式返回的ip位址

rpeerport 用於記錄埠號

lpsockaddr 是乙個sockaddr結構指標,用於記錄套接字名稱

lpsockaddrlen 用於確定lpsockaddr的大小

(4)accept方法

該方法用於接受客戶端的連線。

語法:virtual bool accept( casyncsocket& rconnectedsocket, sockaddr* lpsockaddr = null, int*

lpsockaddrlen = null );

 rconnectedsocket:對應當前連線的套接字引用。

 lpsockaddr:乙個sockaddr結構指標,用於記錄套接字位址。

 lpsockaddrlen:用於確定lpsockaddr的大小。

(5)bind方法

該方法用於將ip位址和埠號繫結到套接字上。

語法:bool bind( uint nsocketport, lpctstr lpszsocketaddress = null );

bool bind ( const sockaddr* lpsockaddr, int nsockaddrlen );

nsocketport 表示套接字埠

lpszsocketaddress 表示ip位址

lpsockaddr 表示乙個sockaddr結構指標,該結構記錄了套接字的位址資訊

nsockaddrlen 確定lpsockaddr的大小

(6)connect方法

該方法用於傳送乙個連線請求。

語法:bool connect( lpctstr lpszhostaddress, uint nhostport );

bool connect( const sockaddr* lpsockaddr, int nsockaddrlen );

lpszhostaddress 表示主機的ip位址或**

nhostport 表示主機的埠

lpsockaddr 是乙個sockaddr結構指標,該結構標識套接字位址資訊

nsockaddrlen 確定lpsockaddr的大小

(7)close方法

該方法用於關閉套接字。

語法:virtual void close( );

(8)listen方法

該方法用於將套接字置於監聽模式。

語法:bool listen( int nconnectionbacklog = 5 );

其中,nconnectionbacklog表示等待連線的最大佇列長度。

(9)receive方法

該方法用於在流式套接字中接收資料。

語法:virtual int receive( void* lpbuf, int nbuflen, int nflags = 0 );

 lpbuf:接收資料的緩衝區。

 nbuflen:用於確定緩衝區的長度。

 nflags:用於確定函式的呼叫模式。為msg_peek,表示用來檢視傳來的資料,在序列前端的資料

會被複製乙份到返回緩衝區中,但是該資料不會從序列中移走;為msg_oob,表示處理帶外資料。

(10)receivefrom方法

該方法用於從資料報套接字中接收資料。

語法:int receivefrom( void* lpbuf, int nbuflen, cstring& rsocketaddress, uint& rsocketport, int nflags = 0 );

int receivefrom( void* lpbuf, int nbuflen, sockaddr* lpsockaddr, int* lpsockaddrlen, int nflags = 0 );

lpbuf 表示接收資料的緩衝區

nbuflen 表示緩衝區的大小

rsocketaddress 用於接收資料報的目的地(ip位址)

rsocketport 用於記錄埠號

lpsockaddr 是乙個sockaddr結構指標,用於記錄套接字位址資訊

lpsockaddrlen 確定lpsockaddr的大小

nflags 確定函式的呼叫模式,為msg_peek,表示用來檢視傳來的資料,在序列前端的資料會被複製乙份到返回緩衝區中,但是該            資料不會從序列中移走;為msg_oob,表示處理帶外資料

(11)send方法

該方法用於向流式套接字中傳送資料。

語法:virtual int send( const void* lpbuf, int nbuflen, int nflags = 0 );

 lpbuf:要傳送資料的緩衝區。

 nbuflen:用於確定緩衝區的大小。

 nflags:函式呼叫方法。

(12)sendto方法

該方法用於在流式套接字或資料報套接字上傳送資料。

語法:int sendto( const void* lpbuf, int nbuflen, uint nhostport, lpctstr lpszhostaddress=null, int nflags = 0 );

int sendto( const void* lpbuf, int nbuflen, const sockaddr* lpsockaddr, int nsockaddrlen, int nflags = 0 );

lpbuf 表示要傳送資料的緩衝區

nbuflen 表示緩衝區大小

nhostport 表示主機埠號

lpszhostaddress 表示主機位址

lpsockaddr 表示乙個sockaddr結構指標,用於確定主機套接字位址資訊

lpsockaddrlen 確定lpsockaddr的大小

nflags 表示函式呼叫方式

(13)shutdown方法

該方法用於在套接字上斷開資料的傳送或接收。

語法:bool shutdown( int nhow = sends );

其中,nhow用於確定shutdown函式的行為,0表示不允許接收,1表示不允許傳送,2表示不允許接收和傳送。

(14)onaccept事件

當套接字接受連線請求時觸發該事件。

語法:virtual void onaccept( int nerrorcode );

其中,nerrorcode表示錯誤**。

(15)onclose事件

當套接字關閉時觸發該事件。

語法:virtual void onclose( int nerrorcode );

其中,nerrorcode表示錯誤**。

(16)onconnect事件

當套接字連線之後觸發該事件。

語法:virtual void onconnect( int nerrorcode);

其中,nerrorcode表示錯誤**。

(17)onreceive事件

當套接字上有資料被接收時觸發該事件。

語法:virtual void onreceive( int nerrorcode );

其中,nerrorcode表示錯誤**。

(18)onsend事件

當套接字傳送資料時觸發該事件。

語法:virtual void onsend( int nerrorcode);

其中,nerrorcode表示錯誤**。

套接字程式設計

1 ipv4 通用套接字的位址結構 struct socketaddr2 ipv6 3 值 結果引數 有點迷糊 套接字位址結構大小作為乙個指標傳給核心的原因 當函式被核心呼叫時,大小結構是乙個值 value 告訴核心該結構的大小,核心在寫該結構時不會越界。當函式返回時,結構大小是乙個結果 resul...

套接字程式設計

例1 建立sockaddr in結構體變數,並繫結套接字 建立套接字 int serv sock socket af inet,sock stream,ipproto tcp 建立sockaddr in結構體變數 struct sockaddr in serv addr memset serv ad...

python套接字程式設計 python套接字程式設計

服務端 usr bin python coding utf 8 import socket s socket.socket host socket.gethostname port 12345 s.bind host,port s.listen 5 while true c,addr s.accep...