青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

doing5552

記錄每日點滴,不枉人生一世

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  73 Posts :: 0 Stories :: 94 Comments :: 0 Trackbacks

公告

常用鏈接

留言簿(24)

我參與的團隊

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 455899
  • 排名 - 49

最新隨筆

最新評論

閱讀排行榜

評論排行榜

CSocket派生于CAsyncSocket, 所有施諸于上的操作皆為同步操作。比如Connnect,Receive等。
同步操作的優點是簡單易用,但缺點也顯而易見,效率低下,因為你必須等到一個操作完成之后才能進行下一個操作。
如果你很關心效率,就應該優先使用CAsyncSocket。反之就用CSocket。
下面將說明如何用CSocket創建簡單的服務器和客戶端。

[創建服務器]

服務器的運作有5個階段:
1. 創建服務器Socket并開啟監聽。
2. 獲取新的客戶端連接Socket,將之加入客戶端Socket列表以管理之。
3. 客戶端Socket讀取數據并發送數據。
4. 客戶端連接被動關閉,從列表刪除。
5. 程序關閉,進而服務器連接主動關閉。

為了維持5階段的運作,需要兩種Socket協同工作, 第一種用作服務器監聽(負責步驟1,2,5),第二種用作客戶端管理(負責步驟3,4)。
兩種Socket皆派生自CSocket, 通過重寫不同的CSocket成員函數以實現不同的功能。

前者需要在服務器初始化階段創建出來CSocket::Create()并開啟監聽CSocket::Listen()(步驟1)。并在服務器退出時主動關閉連接CSocket::Close()(步驟5)。
前者還需要重寫OnAccept以在新的客戶端連接到來時被通知,同時產生客戶端管理Socket(步驟2)。

 

后者需要重寫OnReceive以在有數據到來時被通知,或重寫OnClose以在連接被動關閉(客戶端關閉)時被通知(步驟3,4)。

讀寫數據需要CSocketFile以及CArchieve的支持。前者將CSocket當作一個文件,后者則完成在此文件上的讀寫操作。
通常你需要添加一個CSocketFile成員,兩個CArchieve成員(一個用于讀,一個用于寫),然后在Socket創建完成后初始化這些成員

socketFile_ = new CSocketFile( this ); // 在archive創建出來后基本上就不需要操作他了,直到Socket關閉
archiveIn_ = new CArchive( socketFile_, CArchive::load ); // 用于讀
archiveOut_ = new CArchive( socketFile_, CArchive::store ); // 用于取

并在OnRecevie中用archiveIn_讀取數據,用archiveOut_寫入數據。像這樣:
int value;
archiveIn_ >> value;
archiveOut_ << value * value;

下面是比較完整的Server端的源代碼:

//---------------------------------------------------------------------------------
// CServerDoc.cpp
//---------------------------------------------------------------------------------
BOOL CServerDoc::OnNewDocument()
{
    ...
    serverSocket_ = new CServerSocket( this );
    serverSocket_->Create( 5001 );
    serverSocket_->Listen( 5 );
    return TRUE;
}

void CServerDoc::DeleteContents()
{
    // TODO: Add your specialized code here and/or call the base class
    delete serverSocket_;
    serverSocket_ = NULL;

    // 主動斷開連接
    // release all client sockets
    POSITION position = clientSockets_.GetHeadPosition();
    while ( position != NULL ) {
        delete clientSockets_.GetNext( position );
    }
    clientSockets_.RemoveAll();

    CDocument::DeleteContents();
}

void CServerDoc::OnAccept()
{
    CClientSocket* newClientSocket = new CClientSocket( this );
    serverSocket_->Accept( *newClientSocket );
    newClientSocket->Initialize();
    clientSockets_.AddTail( newClientSocket );
}

// 被動斷開連接
void CServerDoc::OnClose( CClientSocket* clientSocket )
{   
    POSITION position = clientSockets_.Find( clientSocket );   
    clientSockets_.RemoveAt( position );
    delete clientSocket;
}

void CServerDoc::OnReceive( CClientSocket* clientSocket )
{
    // receive data with clientSocket  
}

//---------------------------------------------------------------------------------
// CServerSocket.cpp
//---------------------------------------------------------------------------------
CServerSocket::CServerSocket( CServerDoc* document )
: document_( document )
{
}

CServerSocket::~CServerSocket()
{
}

void CServerSocket::OnAccept(int nErrorCode)
{
    // TODO: Add your specialized code here and/or call the base class
    document_->OnAccept();
    CSocket::OnAccept(nErrorCode);
}

//---------------------------------------------------------------------------------
// CClientSocket.cpp
//---------------------------------------------------------------------------------
CClientSocket::CClientSocket( CServerDoc* document )
: document_( document )
, socketFile_( NULL )
, archiveIn_( NULL )
, archiveOut_( NULL )
{
}

CClientSocket::~CClientSocket()
{
    delete archiveIn_;
    archiveIn_ = NULL;

    delete archiveOut_;
    archiveOut_ = NULL;
   
    // 必須在刪除archive以后刪除
    delete socketFile_;
    socketFile_ = NULL;   
}

void CClientSocket::OnClose(int nErrorCode)
{
    // TODO: Add your specialized code here and/or call the base class   
    CSocket::OnClose(nErrorCode);
    document_->OnClose( this ); // 一定要在最后一行
}

void CClientSocket::OnReceive(int nErrorCode)
{
    // TODO: Add your specialized code here and/or call the base class
    document_->OnReceive( this );
    CSocket::OnReceive(nErrorCode);
}

BOOL CClientSocket::Initialize()
{
    socketFile_ = new CSocketFile( this );
    archiveIn_ = new CArchive( socketFile_, CArchive::load );
    archiveOut_ = new CArchive( socketFile_, CArchive::store );
    return TRUE;
}

[創建客戶端]

客戶端的運作比服務器簡單
1. 創建客戶端Socket并連接到服務器。 CSocket::Create() -> CSocket::Connect()
2. 客戶端Socket讀取數據并發送數據。   CSocket::OnReceive()
3. 客戶端連接被動關閉。                        CSocket::OnClose()
4. 程序關閉,進而客戶端連接主動關閉。CSocket::Close()

下面是比較完整的Client端的源代碼:

//---------------------------------------------------------------------------------
// CClientDlg.cpp
//---------------------------------------------------------------------------------
CClientDlg::CClientDlg(CWnd* pParent /*=NULL*/)
: CDialog(CClientDlg::IDD, pParent)
    , socket_( NULL )   
{
    ...
}

void CClientDlg::OnDestroy()
{
    CDialog::OnDestroy();

    // TODO: Add your message handler code here
    // 主動斷開連接
    delete socket_;
    socket_ = NULL;
}

void CClientDlg::OnBnClickedConnnect()
{
    // TODO: Add your control notification handler code here
    UpdateData( TRUE );

    socket_ = new CClientSocket( this );
    socket_->Create();

    if ( !socket_->Connect( "127.0.0.1", 5001 ) ) {
        delete socket_;
        socket_ = NULL;
        MessageBox( _T( "連接失敗" ) );
        return;
    }
    socket_->Initialize();
}

// 主動斷開連接
void CClientDlg::OnBnClickedDisconnect()
{
    // TODO: Add your control notification handler code here
    delete socket_;
    socket_ = NULL;
}

// 被動斷開連接
void CClientDlg::OnClose()
{
    delete socket_;
    socket_ = NULL;
    MessageBox( _T("服務器斷開") );   
}

void CClientDlg::OnReceive()
{
    // receive data with socket_
}

//---------------------------------------------------------------------------------
// CClientSocket.cpp
//---------------------------------------------------------------------------------
CClientSocket::CClientSocket( CClientDlg* dialog )
: dialog_( dialog )
, socketFile_( NULL )
, archiveIn_( NULL )
, archiveOut_( NULL )
{
}

CClientSocket::~CClientSocket()
{
    delete archiveIn_;
    archiveIn_ = NULL;
    delete archiveOut_;
    archiveOut_ = NULL;
    delete socketFile_;
    socketFile_ = NULL;
}

void CClientSocket::OnClose(int nErrorCode)
{
    // TODO: Add your specialized code here and/or call the base class   
    CSocket::OnClose(nErrorCode);
    dialog_->OnClose();
}

void CClientSocket::OnReceive(int nErrorCode)
{
    // TODO: Add your specialized code here and/or call the base class
    dialog_->OnReceive();
    CSocket::OnReceive(nErrorCode);
}

BOOL CClientSocket::Initialize()
{
    socketFile_ = new CSocketFile( this );
    archiveIn_ = new CArchive( socketFile_, CArchive::load );
    archiveOut_ = new CArchive( socketFile_, CArchive::store );
    return TRUE;
}

posted on 2010-01-12 20:47 doing5552 閱讀(484) 評論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美www| 蜜乳av另类精品一区二区| 欧美在线关看| 欧美在线视频一区二区三区| 香蕉乱码成人久久天堂爱免费 | 亚洲日本精品国产第一区| 久久精品国产久精国产思思| 久久久综合视频| 欧美激情一二三区| 亚洲二区在线视频| 一本色道久久88精品综合| 亚洲在线视频免费观看| 久久久久久午夜| 欧美日韩午夜激情| 国内精品免费在线观看| 国产在线拍偷自揄拍精品| 亚洲国产精品久久久久秋霞不卡 | 欧美一区二区三区在线看| 久久动漫亚洲| 欧美va天堂va视频va在线| 欧美三区在线| 亚洲国产成人av好男人在线观看| 在线亚洲精品| 麻豆精品视频在线| 99精品久久久| 久久综合九色综合欧美狠狠| 欧美视频一区二| 亚洲日本中文字幕区| 欧美在线视频一区二区三区| 91久久线看在观草草青青| 欧美中文字幕在线| 欧美午夜精品久久久久久人妖 | 欧美亚洲日本国产| 麻豆av一区二区三区| 国产日韩在线亚洲字幕中文| 亚洲高清av在线| 亚洲图片激情小说| 麻豆精品精华液| 亚洲一区二区av电影| 欧美国产日韩在线观看| 激情久久婷婷| 久久久久**毛片大全| 亚洲视频精品在线| 欧美区国产区| 91久久夜色精品国产九色| 欧美一区观看| 亚洲一二三级电影| 国产精品你懂的| 正在播放欧美视频| 亚洲精品欧美日韩专区| 欧美大片91| 亚洲国产高清在线| 久久亚洲影院| 久久久久久久欧美精品| 国产亚洲精品久久久| 久久国产加勒比精品无码| 一区二区三区精品视频| 欧美日韩中文字幕日韩欧美| 一本色道久久综合一区| 亚洲国产精品欧美一二99| 老司机成人网| 日韩午夜激情电影| 亚洲裸体俱乐部裸体舞表演av| 欧美激情一区二区三区在线视频观看 | 欧美在线视频一区| 午夜视频久久久久久| 国产日韩欧美在线视频观看| 久久久久久久成人| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产欧美在线视频| 久久夜色精品国产亚洲aⅴ| 久久国产一区二区| 亚洲欧洲三级电影| 一本一本a久久| 国产女精品视频网站免费 | 国产精品a久久久久久| 亚洲一区二区高清视频| 午夜精品国产更新| 亚洲国产成人不卡| 亚洲毛片视频| 国产欧美精品xxxx另类| 蜜臀99久久精品久久久久久软件| 欧美99久久| 欧美亚洲综合网| 日韩一级裸体免费视频| 亚洲欧美日韩精品在线| 国产精品99久久久久久久久久久久| 国产精品乱码人人做人人爱| 久久天天综合| 欧美日韩天天操| 久久激情婷婷| 免费在线观看成人av| 亚洲欧美日韩精品久久奇米色影视| 欧美伊人久久久久久午夜久久久久 | 欧美顶级少妇做爰| 久久视频在线视频| 免费成人av资源网| 亚洲欧美一区二区三区极速播放| 亚洲欧美日韩一区在线| 亚洲激情影院| 欧美在线视频一区| 亚洲线精品一区二区三区八戒| 欧美一区二区网站| 亚洲视频免费看| 久久综合999| 久久精品99国产精品| 欧美日韩国产精品| 欧美成人一二三| 国产亚洲一区二区在线观看| 99精品视频免费在线观看| 伊人久久综合97精品| 亚洲一区二区在线看| 日韩午夜在线观看视频| 久久久亚洲精品一区二区三区| 午夜精品福利电影| 欧美日韩在线免费观看| 亚洲成人在线视频播放 | 国产精品久久一区主播| 亚洲第一网站| **网站欧美大片在线观看| 亚欧成人精品| 欧美一级电影久久| 国产精品欧美一区二区三区奶水| 亚洲三级网站| 日韩亚洲欧美高清| 欧美激情亚洲一区| 亚洲电影激情视频网站| 樱花yy私人影院亚洲| 久久国产主播| 麻豆国产精品va在线观看不卡| 国产一区二区三区黄| 一本色道久久综合亚洲精品小说| 99热精品在线观看| 欧美日韩午夜视频在线观看| 亚洲精品免费观看| 亚洲四色影视在线观看| 欧美三级欧美一级| 亚洲一二三区视频在线观看| 性欧美激情精品| 国产亚洲一区二区三区在线播放| 亚洲福利小视频| 亚洲主播在线| 日韩视频在线播放| 9久草视频在线视频精品| 欧美激情影音先锋| 一本色道久久综合一区| 亚洲欧美日本伦理| 国产亚洲欧美aaaa| 久久色在线播放| 91久久精品国产91性色tv| 99国产精品国产精品久久| 欧美日韩色婷婷| 亚洲综合色在线| 免费久久久一本精品久久区| 91久久香蕉国产日韩欧美9色| 欧美另类在线播放| 亚洲天堂成人在线视频| 久久久精彩视频| 一区二区91| 欧美日韩视频免费播放| 国产精品日韩一区| 亚洲字幕一区二区| 老司机67194精品线观看| 亚洲精品欧美| 国产麻豆综合| 欧美刺激性大交免费视频| 亚洲亚洲精品三区日韩精品在线视频| 久久精品91久久香蕉加勒比| 亚洲精品美女久久7777777| 国产精品高潮视频| 久久一区免费| 亚洲欧美国产另类| 亚洲第一级黄色片| 欧美一区二区在线| 99国产精品久久久久久久| 国产一区二区久久久| 欧美日韩1234| 另类酷文…触手系列精品集v1小说| 国内精品福利| 欧美在线观看视频| 欧美影院一区| 性做久久久久久久久| 欧美777四色影视在线| 久久久久久久一区二区三区| 亚洲人成人77777线观看| 欧美黄色片免费观看| 性感少妇一区| 宅男在线国产精品| 欧美激情第六页| 久久免费视频一区| 亚洲欧美日韩国产中文 | 在线观看日韩av电影| 欧美亚州韩日在线看免费版国语版| 久久久久九九视频| 午夜精品久久久久久久99樱桃| 日韩视频中文| 亚洲人午夜精品免费| 免费高清在线一区| 久久久女女女女999久久| 欧美一区二区视频在线观看2020|