CSocket類網路程式設計 MFC

2022-03-11 09:43:20 字數 3853 閱讀 9352

visual c++的mfc提供了csocket類用來實現網路通訊。

下面介紹vc++在windows 95中實現socket的 csocket 類相關成員函式(這些成員函式實際上是從casyncsocket 類繼承來的)的使用。 

(1) 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 ) 

該函式用來建立socket。 其中,nsocketport 為所選擇的socket 埠,一般要大於 1023, 如果該引數為0,則由系統選定一埠,預設值為0 ;nsockettype 為套接字型別:sock_stream 表示為流套接字,sock_dgram 表示為資料報套接字,預設值為sock_stream ;levent 標識該socket 要完成哪種工作,預設值為fd_read|fd_write|fd_oob| fd_accept|fd_connect|fd_close ;lpszsockaddress 為網路位址資訊結構指標,包含網路位址, 預設值為null 。 

(2)bool bind( uint nsocketport, lpctstr lpszsocketaddress = null ) 

該函式的作用是將socket 埠與網路位址連線起來。引數含義同上 。 

(3)bool listen( int nconnectionbacklog = 5 ) 

該函式的作用是等待socket請求。其中,nconnec-tionbacklog 表示等待佇列的長度,預設值為最大值5 。 

(4)virtual bool accept( casyncsocket& rconnectedsocket, sockaddr* lpsockaddr = null, int* lpsockaddrlen = null ) 

該函式的作用是取得佇列上第乙個連線請求並建立乙個具有與socket相同特性的套接字。其中,rconnectedsocket 表示乙個新的socket 。 

(5)bool connect( lpctstr lpszhostaddress, uint nhostport ) 

該函式的作用是提出請求。其中,lpszhostaddress 和 nhostport 為接受請求程序的網路位址和socket 埠號。 

(6)virtual void close( ) 

該函式的作用是關閉該socket 。 

利用csocket類直接進行資料通訊有兩種方式:一種是利用csocketfile 類和archive 類去實現,另一種是利用csocket的成員函式 receive、send、receivefrom、sendto、listen 和 accept 等來實現(這些成員函式實際上也是從casyncsocket 類繼承的)。 

兩種方法的實現步驟如下 : 

server : construct-> creat-> bind -> listen-> accept-> send->close ; 

cilent : construct ->creat-> connect-> receive-> close。 

下面就用vc++的**分別介紹如何運用上述兩種方法來實現socket 程式設計。 

1、 利用csocketfile類和archive 類實現

(1)伺服器程式流程

// 建立乙個套接字物件

csocket socksrvr; 

//為上述套接字物件建立乙個套接字

socksrvr.create(nport); 

//開始偵聽

socksrvr.listen( ); 

//建立乙個新的套接字物件

csocket sockrecv; 

//接受連線

socksrvr.accept( sockrecv ); 

// 建立檔案物件

csocketfile file(&sockrecv); 

//建立乙個archive物件

carchive arin(&file, carchive::load); 

/*or*/_carchive arout(&file, carchive::store); 

//使用archive物件傳輸資料

arin >> dwvalue; 

/*or*/ arout < < dwvalue; 

(2)客戶端程式流程

//建立乙個套接字物件

csocket sockclient; 

//為這個物件建立乙個套接字

sockclient.create( ); 

//尋找乙個連線

sockclient.connect(straddr, nport); 

//建立乙個檔案物件

csocketfile file(&sockclient); 

//建立乙個archive物件

carchive arin(&file, carchive::load); 

/*or*/_carchive arout(&file, carchive::store); 

//使用這個物件傳輸資料

arout < < dwvalue; 

/*or*/ arin >> dwvalue; 

上述程式中, nport 是socket 的埠號,straddr 是該機器的ip位址(如202.197.1.3 或 

等),這兩個變數在server和client中要一致。當server程序執行至listen 後便處於睡眠狀態直到client程序執行connect 時才被喚醒,而後兩個程序便開始傳輸資料了。 

2、利用csocket的成員函式實現 

(1)伺服器流程

//套接字初始化

if(!afxsocketinit())

// 建立兩個套接字物件

csocket chatsend,server; 

// 建立乙個套接字

if(!chatsend.create(nport)) // nport=1025 

messagebox("sendsocket create failed!", "send",mb_iconstop); 

else

//傳送乙個cstring 物件

server.sendto(cssendtext,cscounts,nport,straddr); 

// 關閉這兩個套接字

server.close(); 

chatsend.close(); 

(2)客戶端程式流程

// 套接字初始化

if(!afxsocketinit())

// 建立乙個套接字物件

csocket chatrecieve; 

// 建立乙個套接字

if(!chatreceive.create())

else

//接受乙個cstring 物件

chatreceive.receivefrom(csreceivetext,cscounts,straddr,nport); 

// 關閉套接字

chatreceive.close(); 

上述兩個程序完成的工作是:由server 程序傳送一字串,client 程序接收。 straddr 和 nport 的含義與方法1 中的相同 ;cssendtext 和 csreceivetext 為傳送與接收的字串;cscounts為字串長度,這一長度在兩個程序中要求接收長度小於或等於傳送長度,否則會導致資料傳輸錯誤。另外,在程式中要加入標頭檔案afxsock.h, csocket 類的有關說明均在afxsock.h 中。 

方法1 適合於對多個不同型別資料的通訊,方法2 適合於對字串的通訊,具體選用何種方法則取決於具體應用的需求。  

C Socket 網路程式設計

過程 img 入門級的測試程式 1 客戶端 include include pragma comment lib,ws2 32.lib tcp 客戶端 void main void if lobyte wsadata.wversion 1 hibyte wsadata.wversion 1 載入套接...

MFC下CSocket程式設計詳解

mfc下csocket程式設計詳解 1.常用的函式和注意事項 詳細的函式介面說明請檢視msdn csocket create 初始化 一般寫伺服器程式都不要用為好,用下面的 csocket socket 初始化 csocket socket初始化 csocket setsockopt 設定socke...

MFC下CSocket程式設計詳解 轉)

mfc下csocket程式設計詳解 1.常用的函式和注意事項 詳細的函式介面說明請檢視msdn csocket create 初始化 一般寫伺服器程式都不要用為好,用下面的 csocket socket 初始化 csocket socket初始化 csocket setsockopt 設定socke...