锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品久久久一本精品,欧美v日韩v国产v,国产精品久久久久久久久借妻http://www.shnenglu.com/amyvmiwei/category/6011.html 鎴樿儨鑷繁灝辨槸鎴樿儨涓鍒? zh-cnWed, 16 Mar 2011 04:37:48 GMTWed, 16 Mar 2011 04:37:48 GMT60[杞琞Flex Socket 涓?C++ 閫氳 --- 瀹夊叏娌欑闂瑙e喅http://www.shnenglu.com/amyvmiwei/archive/2011/03/16/141942.html灝忎笉鐐?/dc:creator>灝忎笉鐐?/author>Wed, 16 Mar 2011 02:22:00 GMThttp://www.shnenglu.com/amyvmiwei/archive/2011/03/16/141942.htmlhttp://www.shnenglu.com/amyvmiwei/comments/141942.htmlhttp://www.shnenglu.com/amyvmiwei/archive/2011/03/16/141942.html#Feedback0http://www.shnenglu.com/amyvmiwei/comments/commentRss/141942.htmlhttp://www.shnenglu.com/amyvmiwei/services/trackbacks/141942.htmlFlex Socket 涓?C++ 閫氳 --- 瀹夊叏娌欑闂瑙e喅

鏈榪戜竴涓」鐩殑瀹㈡埛绔鏀規垚Flex錛屼嬌鐢⊿ocket涓嶤++閫氳鏃墮亣鍒頒簡瀹夊叏娌欑闂錛岃繖鏄垜鐨勮В鍐蟲柟娉曪紱

1):絳栫暐鏂囦歡涓庝富濂楁帴瀛楀湪鍚屼竴绔彛錛屽彧闇璋冪敤 Socket.connect() 鎴?XMLSocket.connect() 鏂規硶錛?/p>

2):絳栫暐鏂囦歡涓庝富濂楁帴瀛楀湪涓嶅悓绔彛錛岄渶浣跨敤鐗規畩鐨?#8220;xmlsocket”璇硶璋冪敤 Security.loadPolicyFile() 鏂規硶錛屽涓嬫墍紺猴細

Security.loadPolicyFile("xmlsocket://server.com:2525");

鍏堣皟鐢?Security.loadPolicyFile() 鏂規硶錛岀劧鍚庡啀璋冪敤 Socket.connect() 鎴?XMLSocket.connect() 鏂規硶銆?/p>

嫻嬭瘯浠g爜錛氫嬌鐢ㄥ悓涓绔彛

view plaincopy to clipboardprint?
#include <winsock2.h>  
#include <windows.h>  
#include <iostream>  
using namespace std;  
#pragma comment(lib,"ws2_32.lib")  

void main()  
{   
    WORD wVersionRequested;  
    WSADATA wsaData;  
    int err;  
    short port=1800;//绔彛鍙?nbsp; 
      
    wVersionRequested = MAKEWORD( 1, 1 );  
    err = WSAStartup( wVersionRequested, &wsaData );//鍒濆鍖栧鎺ュ瓧  
    if ( err != 0 )  
    {  
        return;  
    }  
      
    if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )  
    {  
        WSACleanup( );  
        return;  
    }  
      
    SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//鍒涘緩濂楁帴瀛?nbsp; 
    SOCKET sockConn;//鐢ㄦ潵鍜屽鎴風閫氫俊鐨勫鎺ュ瓧  
    SOCKADDR_IN addrSrv;//鐢ㄦ潵鍜屽鎴風閫氫俊鐨勫鎺ュ瓧鍦板潃  
    addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);  
    addrSrv.sin_family=AF_INET;  
    addrSrv.sin_port=htons(port);  
      
    bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//緇戝畾绔彛  
    listen(sockSrv,5);//渚﹀惉  
      
    printf("Server %d is listening......\n",port);  
      
    SOCKADDR_IN addrClient;  
      
    int len=sizeof(SOCKADDR);  
    char buf[4096];//鎺ユ敹鐨勬暟鎹?nbsp; 
    char rbuf[100]=  
        "<cross-domain-policy> "    
        "<allow-access-from domain=\"*\" to-ports=\"*\"/>"    
        "</cross-domain-policy> ";//濂楁帴瀛楃瓥鐣ユ枃浠?nbsp; 
      
    while(1)  
    {  
        //鎺ュ彈榪炴帴  
        sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);  
        printf("Accept connection from %s\n",inet_ntoa(addrClient.sin_addr));  
          
recv:  
        //鎺ユ敹鏁版嵁  
        int bytes;  
        if((bytes=recv(sockConn,buf,sizeof(buf),0))==SOCKET_ERROR)  
        {  
            printf("鎺ユ敹鏁版嵁澶辮觸!\n");  
            exit(-1);  
        }  

        buf[bytes]='\0';  
        printf("Message from %s: %s\n",inet_ntoa(addrClient.sin_addr),buf);       

        if (0 == strcmp(buf,"<policy-file-request/>"))  
        {  
            //鍙戦佹暟鎹?nbsp; 
            if(send(sockConn,rbuf,strlen(rbuf)+1,0)==SOCKET_ERROR)  
            {  
                printf("鍙戦佹暟鎹け璐ワ紒");  
                exit(-1);  
            }  
            printf("Message to %s: %s\n",inet_ntoa(addrClient.sin_addr),rbuf);  
        }  
        else
        {  
            //Echo  
            if(send(sockConn,buf,strlen(buf)+1,0)==SOCKET_ERROR)  
            {  
                printf("鍙戦佹暟鎹け璐ワ紒");  
                exit(-1);  
            }  
            printf("Message to %s: %s\n",inet_ntoa(addrClient.sin_addr),buf);  
            goto recv;  
        }  
        //娓呯悊濂楁帴瀛楀崰鐢ㄧ殑璧勬簮  
        closesocket(sockConn);  
    }  
}
#include <winsock2.h>
#include <windows.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"ws2_32.lib")

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
short port=1800;//绔彛鍙?br>
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );//鍒濆鍖栧鎺ュ瓧
if ( err != 0 )
{
   return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )
{
   WSACleanup( );
   return;
}

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//鍒涘緩濂楁帴瀛?br>SOCKET sockConn;//鐢ㄦ潵鍜屽鎴風閫氫俊鐨勫鎺ュ瓧
SOCKADDR_IN addrSrv;//鐢ㄦ潵鍜屽鎴風閫氫俊鐨勫鎺ュ瓧鍦板潃
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(port);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//緇戝畾绔彛
listen(sockSrv,5);//渚﹀惉

printf("Server %d is listening......\n",port);

SOCKADDR_IN addrClient;

int len=sizeof(SOCKADDR);
char buf[4096];//鎺ユ敹鐨勬暟鎹?br>char rbuf[100]=
   "<cross-domain-policy> "
   "<allow-access-from domain=\"*\" to-ports=\"*\"/>"
   "</cross-domain-policy> ";//濂楁帴瀛楃瓥鐣ユ枃浠?br>
while(1)
{
        //鎺ュ彈榪炴帴
   sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
   printf("Accept connection from %s\n",inet_ntoa(addrClient.sin_addr));
  
recv:
   //鎺ユ敹鏁版嵁
   int bytes;
   if((bytes=recv(sockConn,buf,sizeof(buf),0))==SOCKET_ERROR)
   {
    printf("鎺ユ敹鏁版嵁澶辮觸!\n");
    exit(-1);
   }

   buf[bytes]='\0';
   printf("Message from %s: %s\n",inet_ntoa(addrClient.sin_addr),buf);  

   if (0 == strcmp(buf,"<policy-file-request/>"))
   {
    //鍙戦佹暟鎹?br>    if(send(sockConn,rbuf,strlen(rbuf)+1,0)==SOCKET_ERROR)
    {
     printf("鍙戦佹暟鎹け璐ワ紒");
     exit(-1);
    }
    printf("Message to %s: %s\n",inet_ntoa(addrClient.sin_addr),rbuf);
   }
   else
   {
    //Echo
    if(send(sockConn,buf,strlen(buf)+1,0)==SOCKET_ERROR)
    {
     printf("鍙戦佹暟鎹け璐ワ紒");
     exit(-1);
    }
    printf("Message to %s: %s\n",inet_ntoa(addrClient.sin_addr),buf);
    goto recv;
   }
        //娓呯悊濂楁帴瀛楀崰鐢ㄧ殑璧勬簮
        closesocket(sockConn);
}
}

 

鏃犺鏄摢縐嶆儏鍐碉紝鏈嶅姟鍣ㄥ潎蹇呴』絳夊緟瀹㈡埛绔殑絎竴嬈′紶杈撲箣鍚庡啀鍐沖畾鏄彂閫佺瓥鐣ユ枃浠惰繕鏄緩绔嬩富榪炴帴銆傚綋 Flash Player 璇鋒眰絳栫暐鏂囦歡鏃訛紝瀹冨緇堜細鍦ㄥ緩绔嬭繛鎺ュ悗浼犺緭浠ヤ笅瀛楃涓詫細

<policy-file-request/>
鏈嶅姟鍣ㄦ敹鍒版瀛楃涓插悗錛屽嵆浼氫紶杈撹絳栫暐鏂囦歡銆傜▼搴忓浜庣瓥鐣ユ枃浠惰姹傚拰涓昏繛鎺ュ茍涓嶄細浣跨敤鍚屼竴榪炴帴錛屽洜姝ゅ簲鍦ㄤ紶杈撶瓥鐣ユ枃浠跺悗鍏抽棴榪炴帴銆傚鏋滀笉鍏抽棴榪炴帴錛孎lash Player 灝嗗叧闂瓥鐣ユ枃浠惰繛鎺ワ紝涔嬪悗閲嶆柊榪炴帴浠ュ緩绔嬩富榪炴帴銆?/p>

闄勭綉緇滆祫鏂欙細

1,棣栧厛媯嫻嬬洰鏍囨湇鍔″櫒鐨?43绔彛鏄惁鎻愪緵瀹夊叏絳栫暐
2,濡傛灉1娌℃湁媯嫻嬪埌絳栫暐錛屽垯媯嫻媋ctionscript鏄惁浣跨敤浜哠ecurity.loadPolicyFile(xmlsocket://) 鎵嬫鎻愪緵瀹夊叏絳栫暐錛屽鏋滆繕娌℃嫻嬪埌錛屽垯浣跨敤絎?姝ユ嫻?br>3,媯嫻嬬洰鏍囨湇鍔″櫒鐩爣绔彛鏄惁鎻愪緵瀹夊叏絳栫暐

 

鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/xuxiangwin/archive/2009/07/07/4324218.aspx



]]>
銆愯漿銆戝畬鎴愮鍙g殑涓涓畝鍗曞皝瑁呯被 http://www.shnenglu.com/amyvmiwei/archive/2008/01/18/41439.html灝忎笉鐐?/dc:creator>灝忎笉鐐?/author>Fri, 18 Jan 2008 13:29:00 GMThttp://www.shnenglu.com/amyvmiwei/archive/2008/01/18/41439.htmlhttp://www.shnenglu.com/amyvmiwei/comments/41439.htmlhttp://www.shnenglu.com/amyvmiwei/archive/2008/01/18/41439.html#Feedback3http://www.shnenglu.com/amyvmiwei/comments/commentRss/41439.htmlhttp://www.shnenglu.com/amyvmiwei/services/trackbacks/41439.html/////////////////////////////////////////////////////////////////////////////////////

//   Iocp 澶存枃浠?/span>

 

#pragma once

 

#include <winsock2.h>

#pragma comment( lib, "ws2_32.lib" )

 

const int OP_READ = 0;

const int OP_WRITE = 1;

const int OP_ACCEPT = 2;

 

/*

     OVERLAPPEDPLUS 緇撴瀯浣撹璁℃濊礬

     OVERLAPPED 鏄竴涓浐瀹氱殑鐢ㄤ簬澶勭悊緗戠粶娑堟伅浜嬩歡榪斿洖鍊肩殑緇撴瀯浣撳彉閲?/span>

     鍦ㄥ畬鎴愮鍙e拰閲嶅彔I/O妯″瀷閲岀敤浜庤繑鍥炴秷鎭簨浠剁殑緇撴灉

     鍥犱負鍦ㄥ鐞嗙綉緇滄秷鎭殑鏃跺欙紝鍙戦佺殑鏄竴涓繑鍥炲肩殑緇撴瀯浣撴寚閽堬紝鍙緇撴瀯浣?/span>

     鐨勫墠闈㈤儴鍒嗘弧瓚崇郴緇熺殑瑕佹眰錛屽湪緋葷粺鎿嶄綔鎴愬姛鐨勬椂鍊欎篃灝變細鎶婅繖涓粨鏋勪綋鎸囬拡

     鍙戝洖緇欑敤鎴鳳紝鎴戜滑鍙鍦ㄧ郴緇熷畾涔夌殑緇撴瀯浣撳悗闈㈡墿灞曚竴浜涜嚜宸辯殑涓滆タ錛屽氨鍙互

     寰堣交鏉劇殑紜畾璇ユ秷鎭槸璋佸彂榪囨潵鐨勩?/span>

     涓嶈繃濂藉儚瀹屾垚绔彛鍦ㄨ璁$殑鏃跺欎篃婊¤凍浜嗚繖鏍風殑闇姹傦紝鎵浠ュ湪榪欓噷鎴戝彧鏄斁鍏?/span>

     涓浜涗笌緋葷粺榪炴帴鏈夊叧鐨勬暟鎹紝鐢ㄦ埛闇瑕佸瓨鏀劇殑鏁版嵁榪欓噷灝變笉鍦ㄥ瓨鏀?/span>

     榪欓噷瀛樺偍涓庣郴緇熺浉鍏崇殑鏁版嵁鏈夛細

     socket

     OpCode 鏈娑堟伅鐨勬搷浣滅被鍨嬶紙鍦ㄥ畬鎴愮鍙g殑鎿嶄綔閲岄潰錛屾槸浠ユ秷鎭氱煡緋葷粺錛?/span>

         璇繪暟鎹?/span>/鍐欐暟鎹紝閮芥槸瑕佸彂榪欐牱鐨勬秷鎭粨鏋勪綋榪囧幓鐨勶紝鎵浠ュ鏋滅郴緇熻鍚屾椂

         榪涜璇誨啓鎿嶄綔鐨勮瘽錛屽氨闇瑕佹湁涓涓彉閲忔潵鍖哄垎鎿嶄綔浜嗭級

 

     WSABUF   wbuf;                  //   璇誨啓緙撳啿鍖虹粨鏋勪綋鍙橀噺

     DWORD    dwBytes, dwFlags; //   涓浜涘湪璇誨啓鏃剁敤鍒扮殑鏍囧織鎬у彉閲?/span>

     char buf[4096];                  //   鑷繁鐨勭紦鍐插尯

     涓婇潰鐨?/span>4涓彉閲忓瓨鏀劇殑鏄竴浜涗笌娑堟伅鐩稿叧鐨勬暟鎹紝閮芥槸涓浜涙搷浣滀笂鐢ㄥ埌鐨勶紝

     榪欎簺涓滆タ閮芥槸鍥哄畾鐨勶紝鍏蜂綋浣滅敤闇瑕佸弬鑰冧竴涓嬪畬鎴愮鍙g浉鍏沖嚱鏁扮殑鍙傛暟鎺ュ彛

*/

struct OVERLAPPEDPLUS

{

     OVERLAPPED    ol;

     SOCKET        s;

     int OpCode;

     WSABUF   wbuf;

     DWORD    dwBytes, dwFlags;

     char buf[4096];

};

 

class CIOCP

{

protected:

     HANDLE g_hwThread;     //   宸ヤ綔綰跨▼鍙ユ焺

     DWORD m_wthreadID;

     HANDLE g_haThread;     //   榪炴帴綰跨▼鍙ユ焺

     DWORD m_athreadID;

public:

     bool m_workThread;

     bool m_acceptThread;

     HANDLE m_hIocp;             //   瀹屾垚绔彛鐨勫彞鏌?/span>

     SOCKET m_sSocket;

    

public:

     CIOCP(void);

     ~CIOCP(void);

     virtual void OnRead(void * p, char *buf, int len){};

     virtual void OnAccept(SOCKET socket);

     virtual void OnClose(void * p){};

     bool SetIoCompletionPort(SOCKET socket, void *p, char *buf = NULL, int len = 0);

         //   鎶婁竴涓?/span>socket涓庝竴涓嚜瀹氫箟鐨勭粨鏋勪綋鍏寵仈鍒板畬鎴愮鍙o紙鐩稿綋浜庢妸socket涓庝竴涓粨鏋勪綋鍙橀噺榪涜緇戝畾錛夛紝

         //   榪欐牱褰撳彂閫佷笂闈?/span>3縐嶇綉緇滀簨浠剁殑鏃跺欙紝璇ョ粨鏋勪綋鍙橀噺浼氬啀浼犲洖緇欑▼搴?/span>

         //   榪欐牱灝卞彲浠ュ尯鍒嗗綋鍓嶇綉緇滀簨浠舵槸閭d釜socket鍙戝嚭鐨?/span>

     bool Init(void);

     bool Listen(int port);

     static DWORD __stdcall WorkThread(LPVOID Param);

     static DWORD __stdcall AcceptThread(LPVOID Param);

};

 

class CIOCPClient: public CIOCP

{

protected:

     SOCKET m_socket;

public:

     bool Connect(char *ip, int port);

     void Send(char *buf, int len);

};

 

 

 

 

 

 

 

 

 

 

 

//////////////////////////////////////////////////////////////////////////////////////////

//   Iocp 瀹炵幇鏂囦歡

 

#include "StdAfx.h"

#include "iocp.h"

 

static bool bInit = false;

 

DWORD __stdcall CIOCP::WorkThread(LPVOID Param)

{

     CIOCP * pthis = (CIOCP *)Param;

 

     void * re;

     OVERLAPPED * pOverlap;

     DWORD berByte;

     while(pthis->m_workThread)

     {

         int ret;

         ret = GetQueuedCompletionStatus(pthis->m_hIocp, &berByte, (LPDWORD)&re, (LPOVERLAPPED *)&pOverlap, INFINITE);

 

         if (ret == ERROR_SUCCESS)

         {

 

         }

 

         if (berByte == 0)

         {

              //   瀹㈡埛绔柇寮榪炴帴

              pthis->OnClose(re);

              OVERLAPPEDPLUS *olp = (OVERLAPPEDPLUS *)pOverlap;

              closesocket(olp->s);

              delete olp;        //   閲婃斁 涓?/span>socket緇戝畾鐨勭粨鏋勪綋鍙橀噺

              continue;

         }

 

         if (re == NULL) return 0;

 

         OVERLAPPEDPLUS *olp = (OVERLAPPEDPLUS *)pOverlap;

 

         switch(olp->OpCode)

         {

         case OP_READ:

              pthis->OnRead(re, olp->wbuf.buf, berByte);     //   璋冪敤 OnRead() 閫氱煡搴旂敤紼嬪簭錛屾湇鍔″櫒鏀跺埌鏉ヨ嚜瀹㈡埛绔殑緗戠粶鏁版嵁

              WSARecv(olp->s, &olp->wbuf, 1, &olp->dwBytes, &olp->dwFlags, &olp->ol, NULL); //   緇х畫璋冪敤涓涓帴鏀剁殑 I/O 寮傛璇鋒眰

              break;

         default:

              break;

         }

     }

     return 0;

}

 

DWORD __stdcall CIOCP::AcceptThread(LPVOID Param)

{

     CIOCP * pthis = (CIOCP *)Param;

     while(pthis->m_acceptThread)

     {

         SOCKET client;

         if ((client= accept(pthis->m_sSocket, NULL, NULL)) == INVALID_SOCKET)

         {

              //   閿欒澶勭悊

         }

         pthis->OnAccept(client);    //   璋冪敤 OnAccept()閫氱煡搴旂敤紼嬪簭鏈夋柊瀹㈡埛绔繛鎺?/span>

        

     }

     return 1;

}

 

CIOCP::CIOCP(void)

{

}

 

CIOCP::~CIOCP(void)

{

}

 

bool CIOCP::Init(void)

{

     if (bInit)

         return true;

 

     WSADATA wsd;

     if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)

         return false;

 

     bInit = true;

     return true;

}

 

bool CIOCP::Listen(int port)

{

     if (!bInit)

         if (!Init())

              return false;

 

     m_sSocket = socket(AF_INET, SOCK_STREAM, 0);

 

     if (m_sSocket == INVALID_SOCKET)

         return false;

 

     //SOCKADDR_IN addr;

     sockaddr_in addr;

     addr.sin_family = AF_INET;

     addr.sin_port = htons(port);

     addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

     //addr.sin_addr.S_un.S_addr = inet_addr(ip);

 

     if (bind(m_sSocket, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR)

         return false;

 

     if (listen(m_sSocket, 10) == SOCKET_ERROR)

         return false;

 

     if ((m_hIocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0)) == NULL)     //   鍒涘緩瀹屾垚绔彛鐨勫彞鏌?/span>

         return false;

 

     this->m_acceptThread = true;

     g_haThread = CreateThread(NULL, 0, AcceptThread, (LPVOID)this, 0, &m_athreadID);    //   鍒涘緩榪炴帴綰跨▼錛岀敤鏉ユ帴鏀跺鎴風鐨勮繛鎺?/span>

 

     this->m_workThread = true;

     g_hwThread = CreateThread(NULL, 0, WorkThread, (LPVOID)this, 0, &m_wthreadID); //   鍒涘緩宸ヤ綔綰跨▼錛岀敤鏉ュ鐞嗗畬鎴愮鍙f秷鎭殑

     return true;

}

 

bool CIOCP::SetIoCompletionPort(SOCKET socket, void *p, char *buf, int len)

{

     if (CreateIoCompletionPort((HANDLE)socket, m_hIocp, (ULONG_PTR)p, 0) == NULL)

         return false;

 

     OVERLAPPEDPLUS *olp = new OVERLAPPEDPLUS;

     memset(olp, 0, sizeof(OVERLAPPEDPLUS));

     olp->s = socket;

     if (buf)

     {

         //   榪欓噷鍙互浣跨敤鐢ㄦ埛鑷畾涔夌殑緙撳啿鍖哄湴鍧錛屽鏋滅敤鎴蜂笉鎯寵緗紝涔熷彲浠ラ噰鐢ㄩ粯璁ゅ垎閰嶇殑緙撳啿鍖?/span>

         olp->wbuf.buf = buf;

         olp->wbuf.len = len;

     }

     else

     {

         olp->wbuf.buf = olp->buf;

         olp->wbuf.len = 4096;

     }

     olp->OpCode = OP_READ;

     int ret = WSARecv(olp->s, &olp->wbuf, 1, &olp->dwBytes, &olp->dwFlags, &olp->ol, NULL);

     if (ret == SOCKET_ERROR)

         if (WSAGetLastError() != ERROR_IO_PENDING)

              return false;

     return true;

}

 

void CIOCP::OnAccept(SOCKET socket)

{

     this->SetIoCompletionPort(socket, NULL);

}

 

//===================================================================================

bool CIOCPClient::Connect(char *ip, int port)

{

         //   榪炴帴鏈嶅姟鍣?/span>

     if (!bInit)

         if (!Init())

              return false;

 

     //   鍒濆鍖栬繛鎺?/span>socket

     m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

     if (m_socket == SOCKET_ERROR)

     {

//       printf("cocket Create fail");

         return false;

     }

 

     // 濉啓鏈嶅姟鍣ㄥ湴鍧淇℃伅

     // 绔彛涓?/span>1982

     // IP鍦板潃涓?/span>INADDR_ANY錛屾敞鎰忎嬌鐢?/span>htonl灝?/span>IP鍦板潃杞崲涓虹綉緇滄牸寮?/span>ServerAddr.sin_family = AF_INET;

     sockaddr_in ClientAddr;

     ClientAddr.sin_family = AF_INET;

     ClientAddr.sin_port = htons(port);   

     ClientAddr.sin_addr.s_addr = inet_addr(ip);

 

     // 緇戝畾鐩戝惉绔彛

     bind(m_socket, (SOCKADDR *)&ClientAddr, sizeof(ClientAddr));

 

     if (connect(m_socket, (SOCKADDR *)&ClientAddr, sizeof(ClientAddr)) == SOCKET_ERROR)

     {

         return false;

     }

    

     if ((m_hIocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0)) == NULL)     //   鍒涘緩瀹屾垚绔彛鐨勫彞鏌?/span>

         return false;

 

     this->m_workThread = true;

     g_hwThread = CreateThread(NULL, 0, WorkThread, (LPVOID)this, 0, &m_wthreadID); //   鍒涘緩宸ヤ綔綰跨▼錛岀敤鏉ュ鐞嗗畬鎴愮鍙f秷鎭殑

 

     this->SetIoCompletionPort(m_socket, &m_socket);    //   璁劇疆瀹屾垚绔彛鐩戝惉鐨?/span>socket

     return true;

}

 

void CIOCPClient::Send(char *buf, int len)

{

     send(m_socket, buf, len, 0);

}

 

 

///////////////////////////////////////////////////////////////////////////////////

// IOCPclient 搴旂敤浠g爜

 

#include "stdafx.h"

#include "IOCP.h"

#include "TClientSocket.h"

class Iocp :public CIOCPClient

{

      void OnRead(void * p, char *buf, int len)

      {

          printf(buf);

          Sleep(1000);

          this->Send(buf, len);

      }

};

 

int _tmain(int argc, _TCHAR* argv[])

{

     Iocp iocp;

     iocp.Init();

     iocp.Connect("127.0.0.1", 4311);

     iocp.Send("test\0", 5);

    

     gets(new char[1000]);

     return 0;

}



]]>
銆愯漿銆戝畬鎴愮鍙d笌楂樻ц兘鏈嶅姟鍣ㄧ▼搴忓紑鍙?http://www.shnenglu.com/amyvmiwei/archive/2008/01/18/41438.html灝忎笉鐐?/dc:creator>灝忎笉鐐?/author>Fri, 18 Jan 2008 13:27:00 GMThttp://www.shnenglu.com/amyvmiwei/archive/2008/01/18/41438.htmlhttp://www.shnenglu.com/amyvmiwei/comments/41438.htmlhttp://www.shnenglu.com/amyvmiwei/archive/2008/01/18/41438.html#Feedback0http://www.shnenglu.com/amyvmiwei/comments/commentRss/41438.htmlhttp://www.shnenglu.com/amyvmiwei/services/trackbacks/41438.html鏃╁湪涓ゅ勾鍓嶆垜灝卞凡緇忚兘寰堢啛緇冪殑榪愮敤瀹屾垚绔彛榪欑鎶鏈簡,鍙槸涓鐩存病鏈夋満浼氬皢瀹冪敤鍦ㄤ粈涔堥」鐩腑,榪欐鏃墮棿瑙佸埌榪欑鎶鏈榪囧垎鐐掍綔,榪囧垎鐨勭縐樺寲,灝辨兂鍐欎竴綃囪В閲婂畠濡備綍宸ヤ綔鐨勬枃绔?鎯沖憡璇夊ぇ瀹跺畠娌℃湁浼犺涓殑閭d箞楂樻繁闅炬噦!鏈変粈涔堥敊璇殑鍦版柟榪樿楂樹漢鎸囨.杞澆璇鋒敞鏄庡嚭澶勫強浣滆?璋㈣阿!

浠ヤ竴涓枃浠朵紶杈撴湇鍔$涓轟緥,鍦ㄦ垜鐨勬満鍣ㄤ笂瀹冨彧璧蜂袱涓嚎紼嬪氨鍙互涓哄緢澶氫釜涓鎴風鍚屾椂鎻愪緵鏂囦歡涓嬭澆鏈嶅姟,紼嬪簭鐨勬ц兘浼氶殢鏈哄櫒鍐匔PU涓暟鐨勫鍔犺岀嚎鎬у闀?鎴戝敖鍙兘鍋氬埌浣垮畠娓呮櫚鏄撴噦,铏界劧紼嬪簭寰堝皬鍗寸敤鍒頒簡NT 5鐨勪竴浜涙柊鐗規?閲嶅彔IO,瀹屾垚绔彛浠ュ強綰跨▼姹?鍩轟簬榪欑妯″瀷鐨勬湇鍔$紼嬪簭搴旇鏄疦T緋葷粺涓婃ц兘鏈濂界殑浜?

棣栧厛.鍋氫負瀹屾垚绔彛鐨勫熀紜,鎴戜滑搴旇鐞嗚В閲嶅彔IO,榪欓渶瑕佷綘宸茬粡鐞嗚В浜嗗唴鏍稿璞″強鎿嶄綔緋葷粺鐨勪竴浜涙蹇墊蹇?浠涔堟槸淇″彿/闈炰俊鍙鋒?浠涔堟槸絳夊緟鍑芥暟,浠涔堟槸鎴愬姛絳夊緟鐨勫壇浣滅敤,浠涔堟槸綰跨▼鎸傝搗絳?濡傛灉榪欎簺姒備護榪樻病鏈夌悊瑙?浣犲簲璇ュ厛鐪嬩竴涓媁indows 鏍稿績緙栫▼涓殑鐩稿叧鍐呭.濡傛灉宸茬粡鐞嗚В榪欎簺,閭d箞閲嶅彔IO瀵逛綘鏉ヨ騫朵笉闅?

浣犲彲浠ヨ繖鏍瘋涓洪噸鍙營O,鐜板湪浣犲凡緇忚繘鍏ヤ竴涓湇鍔″櫒/瀹㈡埛鏈虹幆澧?璇蜂笉瑕佹販娣嗘蹇?榪欓噷鐨勬湇鍔″櫒鏄寚鎿嶄綔緋葷粺,鑰屽鎴鋒満鏄寚浣犵殑紼嬪簭(瀹冭繘琛孖O鎿嶄綔),鏄綋浣犺繘琛孖O鎿嶄綔(send,recv,writefile,readfile....)鏃朵綘鍙戦佷竴涓狪O璇鋒眰緇欐湇鍔″櫒(鎿嶄綔緋葷粺),鐢辨湇鍔″櫒鏉ュ畬鎴愪綘闇瑕佺殑鎿嶄綔,鐒跺悗浣犱粈涔堜簨閮芥病鏈変簡,褰撴湇鍔″櫒瀹屾垚IO璇鋒眰鏃跺畠浼氶氱煡浣?褰撶劧鍦ㄨ繖鏈熼棿浣犲彲浠ュ仛浠諱綍浜?涓涓父鐢ㄧ殑鎶宸ф槸鍦ㄥ彂閫侀噸鍙營O璇鋒眰鍚?紼嬪簭鍦ㄤ竴涓驚鐜腑涓杈硅皟鐢≒eekMessage,TranslateMessage鍜孌ispatchMessage鏇存柊鐣岄潰,鍚屾椂璋冪敤GetOverlappedResult絳夊緟鏈嶅姟鍣ㄥ畬鎴怚O鎿嶄綔,鏇撮珮鏁堜竴鐐圭殑鍋氭硶鏄嬌鐢↖O瀹屾垚渚嬬▼鏉ュ鐞嗘湇鍔″櫒(鎿嶄綔緋葷粺)榪斿洖鐨勭粨鏋?浣嗗茍涓嶆槸姣忎釜鏀寔閲嶅彔IO鎿嶄綔鐨勫嚱鏁伴兘鏀寔瀹屾垚渚嬬▼濡俆ransmitFile鍑芥暟.

渚?.涓嬈¢噸鍙犲啓鎿嶄綔榪囩▼(GetOverlappedResult鏂規硶):
1.濉啓涓涓狾VERLAPPED緇撴瀯
2.榪涜涓嬈″啓鎿嶄綔,騫舵寚瀹氶噸鍙犳搷浣滃弬鏁?涓婇潰鐨凮VERLAPPED緇撴瀯鍙橀噺鐨勬寚閽?
3.鍋氬叾瀹冧簨(濡傛洿鏂扮晫闈?
4.GetOverlappedResult鍙栨搷浣滅粨鏋?br>5.濡傛灉IO璇鋒眰娌℃湁瀹屾垚,騫朵笖娌℃湁鍑洪敊鍒欏洖鍒版湡錛?br>6.澶勭悊IO鎿嶄綔緇撴灉

渚?.涓嬈¢噸鍙犲啓鎿嶄綔榪囩▼(瀹屾垚渚嬬▼鏂規硶):
1.濉啓涓涓狾VERLAPPED緇撴瀯
2.榪涜涓嬈″啓鎿嶄綔,騫舵寚瀹氶噸鍙犳搷浣滃弬鏁?涓婇潰鐨凮VERLAPPED緇撴瀯鍙橀噺鐨勬寚閽?,騫舵寚瀹氬畬鎴愪緥紼?br>3.鍋氬叾瀹冧簨(濡傛洿鏂扮晫闈?
4.褰撳畬鎴愪緥紼嬭璋冪敤璇存槑IO鎿嶄綔宸茬粡瀹屾垚鎴栧嚭閿?鐜板湪鍙互瀵規搷浣滅粨鏋滆繘琛屽鐞嗕簡


濡傛灉浣犲凡緇忕悊瑙d笂闈㈢殑姒傚康,灝卞凡緇忓緢鎺ヨ繎IO瀹屾垚绔彛浜?褰撶劧榪欏彧鏄緢甯歌鐨勯噸鍙犳搷浣滃畠宸茬粡闈炲父楂樻晥,浣嗗鏋滃啀緇撳悎澶氱嚎紼嬪涓涓狥ile鎴栨槸Socket榪涜閲嶅彔IO鎿嶄綔灝變細闈炲父澶嶆潅,閫氬父紼嬪簭鍛樺緢闅炬妸鎻¤繖縐嶅鏉傚害.瀹屾垚绔彛鍙互璇村氨鏄負浜嗗厖鍒嗗彂鎸ュ綰跨▼鍜岄噸鍙營O鎿嶄綔鐩哥粨鍚堢殑鎬ц兘鑰岃璁$殑.寰堝浜洪兘璇村畠澶嶆潅,鍏跺疄濡傛灉浣犺嚜宸卞疄鐜頒竴涓綰跨▼鐨勫涓涓狥ile鎴栨槸Socket榪涜閲嶅彔IO鎿嶄綔鐨勭▼搴?娉ㄦ剰鏄涓嚎紼嬪涓涓狧ANDLE鎴朣OCKET榪涜閲嶅彔IO鎿嶄綔,鑰屼笉鏄惎涓涓嚎紼嬪涓涓狧ANDLE榪涜閲嶅彔IO鎿嶄綔)灝變細鍙戠幇瀹屾垚绔彛瀹為檯涓婄畝鍖栦簡澶氱嚎紼嬮噷浣跨敤閲嶅彔IO鐨勫鏉傚害,騫朵笖鎬ц兘鏇撮珮,鎬ц兘楂樺湪鍝?涓嬮潰榪涜璇存槑.

鎴戜滑鍙兘鍐欒繃榪欐牱鐨勬湇鍔$紼嬪簭:

渚?.涓葷▼搴?
1.鐩戝惉涓涓鍙?br>2.絳夊緟榪炴帴
3.褰撴湁榪炴帴鏉ユ椂
4.鍚竴涓嚎紼嬪榪欎釜瀹㈡埛绔繘琛屽鐞?br>5.鍥炲埌2

鏈嶅姟綰跨▼:
1.璇誨鎴風璇鋒眰
2.濡傛灉瀹㈡埛绔笉鍐嶆湁璇鋒眰,鎵ц6
3.澶勭悊璇鋒眰
4.榪斿洖鎿嶄綔緇撴灉
5.鍥炲埌1
6.閫鍑虹嚎紼?br>
榪欐槸涓縐嶆渶綆鍗曠殑緗戠粶鏈嶅姟鍣ㄦā鍨?鎴戜滑鎶婂畠浼樺寲涓涓?br>
渚?.涓葷▼搴?
1.寮涓涓嚎紼嬫睜,閲岄潰鏈夋満鍣ㄨ兘鎵垮彈鐨勬渶澶х嚎紼嬫暟涓嚎紼?綰跨▼閮藉浜庢寕璧?suspend)鐘舵?br>1.鐩戝惉涓涓鍙?br>2.絳夊緟榪炴帴
3.褰撴湁榪炴帴鏉ユ椂
4.浠庣嚎紼嬫睜閲孯esume涓涓嚎紼嬪榪欎釜瀹㈡埛绔繘琛屽鐞?br>5.鍥炲埌2

鏈嶅姟綰跨▼涓庝緥3妯″瀷閲岀殑鐩稿悓,鍙槸褰撶嚎紼嬪鐞嗗畬瀹㈡埛绔墍鏈夎姹傚悗,涓嶆槸閫鍑鴻屾槸鍥炲埌綰跨▼姹?鍐嶆鎸傝搗璁╁嚭CPU鏃墮棿,騫剁瓑寰呬負涓嬩竴涓鎴鋒満鏈嶅姟.褰撶劧鍦ㄦ鏈熼棿綰跨▼浼氬洜涓篒O鎿嶄綔(鏈嶅姟綰跨▼鐨勭1,5鎿嶄綔,涔熻榪樻湁鍏跺畠闃誨鎿嶄綔)鎸傝搗鑷繁,浣嗕笉浼氬洖鍒扮嚎紼嬫睜,涔熷氨鏄瀹冧竴嬈″彧鑳戒負涓涓鎴風鏈嶅姟.

榪欏彲鑳芥槸浣犺兘鎯沖埌鐨勬渶楂樻晥鐨勬湇鍔$妯″瀷浜嗗惂!瀹冧笌絎竴涓湇鍔$妯″瀷鐩告瘮灝戜簡寰堝涓敤鎴鋒佸埌鍐呮牳鎬佺殑CONTEXT Switch,鍙嶆槧涔熸洿鍔犲揩閫?涔熻浣犲彲鑳借寰楄繖寰堝井涓嶈凍閬?榪欒鏄庝綘緙哄皯瀵瑰ぇ瑙勬ā楂樻ц兘鏈嶅姟鍣ㄧ▼搴?姣斿緗戞父鏈嶅姟绔?鐨勮璇?濡傛灉浣犵殑鏈嶅姟绔▼搴忚瀵瑰嚑鍗冧竾涓鎴風榪涜鏈嶅姟鍛?榪欎篃鏄井杞疻indows NT寮鍙戠粍鍦∟T 5浠ヤ笂鐨勭郴緇熶腑娣誨姞綰跨▼姹犵殑鍘熷洜.

鎬濊冧竴涓嬩粈涔堟牱鐨勬ā鍨嬪彲浠ヨ涓涓嚎紼嬩負澶氫釜瀹㈡埛绔湇鍔″憿!閭e氨瑕佽煩鍑烘瘡鏉ヤ竴涓繛鎺ュ惎綰跨▼涓哄叾鏈嶅姟鐨勫浐瀹氭濈淮妯″紡,鎴戜滑鎶婄嚎紼嬫湇鍔$殑鏈灝忓崟鍏冨垎鍓蹭負鍗曠嫭鐨勮鎴栧啓鎿嶄綔(娉ㄦ剰鏄鎴栧啓涓嶆槸璇誨拰鍐?,鑰屼笉鏄竴涓鎴風浠庤繛鎺ュ埌鏂紑鏈熼棿鐨勬墍鏈夎鍐欐搷浣?姣忎釜綰跨▼閮戒嬌鐢ㄩ噸鍙營O榪涜璇誨啓鎿嶄綔,鎶曢掍簡璇誨啓璇鋒眰鍚庣嚎紼嬪洖鍒扮嚎紼嬫睜,絳夊緟涓哄叾瀹冨鎴鋒満鏈嶅姟,褰撴搷浣滃畬鎴愭垨鍑洪敊鏃跺啀鍥炴潵澶勭悊鎿嶄綔緇撴灉,鐒跺悗鍐嶅洖鍒扮嚎紼嬫睜.

鐪嬬湅榪欐牱鐨勬湇鍔″櫒妯″瀷:
渚?.涓葷▼搴?
1.寮涓涓嚎紼嬫睜,閲岄潰鏈夋満鍣ㄥ唴CPU涓暟涓ゅ嶇殑綰跨▼,綰跨▼閮藉浜庢寕璧?suspend)鐘舵?瀹冧滑鍦ㄩ兘絳夊鐞嗕竴嬈¢噸鍙營O鎿嶄綔鐨勫畬鎴愮粨鏋?br>1.鐩戝惉涓涓鍙?br>2.絳夊緟榪炴帴
3.褰撴湁榪炴帴鏉ユ椂
4.鎶曢掍竴涓噸鍙犺鎿嶄綔璇誨彇鍛戒護
5.鍥炲埌2

鏈嶅姟綰跨▼:
1.濡傛灉璇誨畬鎴?鍒欏鐞嗚鍙栫殑鍐呭(濡侶TTP GET鍛戒護),鍚﹀垯鎵ц3
2.鎶曢掍竴涓噸鍙犲啓鎿嶄綔(濡傝繑鍥濰TTP GET鍛戒護闇瑕佺殑緗戦〉)
3.濡傛灉鏄竴涓啓鎿嶄綔瀹屾垚,鍙互鍐嶆姇閫掍竴涓噸鍙犺鎿嶄綔,璇誨彇瀹㈡埛鏈虹殑涓嬩竴涓姹?鎴栬呮槸鍏抽棴榪炴帴(濡侶TTP鍗忚閲屾瘡鍙戝畬涓涓綉欏靛氨鏂紑)
4.鍙栧緱涓嬩竴涓噸鍙營O鎿嶄綔緇撴灉,濡傛灉IO鎿嶄綔娌℃湁瀹屾垚鎴栨病鏈塈O鎿嶄綔鍒欏洖鍒扮嚎紼嬫睜

鍋囪榪欐槸涓涓猈EB鏈嶅姟鍣ㄧ▼搴?鍙互鐪嬪埌宸ヤ綔鑰呯嚎紼嬫槸浠ヨ鎴栧啓涓烘渶灝忕殑宸ヤ綔鍗曞厓榪愯鐨?鍦ㄤ富紼嬪簭閲岄潰榪涜浜嗕竴嬈¢噸鍙犺鎿嶄綔

褰撹鎿嶄綔瀹屾垚鏃朵竴涓嚎紼嬫睜涓殑涓涓伐浣滆呯嚎紼嬭嬋媧誨彇寰椾簡鎿嶄綔緇撴灉,澶勭悊GET鎴朠OST鍛戒護,鐒跺悗鍙戦佷竴涓綉欏靛唴瀹?鍙戦佷篃鏄竴涓噸鍙犳搷浣?鐒跺悗澶勭悊瀵瑰叾瀹冨鎴鋒満鐨処O鎿嶄綔緇撴灉,濡傛灉娌℃湁鍏跺畠鐨勪笢瑗塊渶瑕佸鐞嗘椂鍥炲埌綰跨▼姹犵瓑寰?鍙互鐪嬪埌浣跨敤榪欑妯″瀷鍙戦佸拰鎺ユ敹鍙互鏄篃鍙互涓嶆槸涓涓嚎紼?

褰撳彂閫佹搷浣滃畬鎴愭椂,綰跨▼姹犱腑鐨勪竴涓伐浣滆呯嚎紼嬫睜嬋媧?瀹冨叧闂繛鎺?HTTP鍗忚),鐒跺悗澶勭悊鍏跺畠鐨処O鎿嶄綔緇撴灉,濡傛灉娌℃湁鍏跺畠鐨勪笢瑗塊渶瑕佸鐞嗘椂鍥炲埌綰跨▼姹犵瓑寰?

鐪嬬湅鍦ㄨ繖鏍風殑妯″瀷涓竴涓嚎紼嬫庝箞涓哄涓鎴風鏈嶅姟,鍚屾牱鏄ā鎷熶竴涓猈EB鏈嶅姟鍣ㄤ緥瀛?

鍋囧鐜板湪緋葷粺涓湁涓や釜綰跨▼,ThreadA,ThreadB瀹冧滑鍦ㄩ兘絳夊鐞嗕竴嬈¢噸鍙營O鎿嶄綔鐨勫畬鎴愮粨鏋?br>
褰撲竴涓鎴鋒満ClientA榪炴帴鏉ユ椂涓葷▼搴忔姇閫掍竴涓噸鍙犺鎿嶄綔,鐒跺悗絳夊緟涓嬩竴涓鎴鋒満榪炴帴,褰撹鎿嶄綔瀹屾垚鏃禩hreadA琚縺媧?瀹冩敹鍒頒竴涓狧TTP GET鍛戒護,鐒跺悗ThreadA浣跨敤閲嶅彔鍐欐搷浣滃彂閫佷竴涓綉欏電粰ClientA,鐒跺悗绔嬪嵆鍥炲埌綰跨▼姹犵瓑寰呭鐞嗕笅涓涓狪O鎿嶄綔緇撴灉,榪欐椂鍙戦佹搷浣滆繕娌℃湁瀹屾垚,鍙堟湁涓涓鎴鋒満ClientB榪炴帴鏉?涓葷▼搴忓啀鎶曢掍竴涓噸鍙犺鎿嶄綔,褰撹鎿嶄綔瀹屾垚鏃禩hreadA(褰撶劧涔熷彲鑳芥槸ThreadB)鍐嶆琚縺媧?瀹冮噸澶嶅悓鏍鋒楠?鏀跺埌涓涓狦ET鍛戒護,浣跨敤閲嶅彔鍐欐搷浣滃彂閫佷竴涓綉欏電粰ClientB,榪欐瀹冩病鏈夋潵寰楀強鍥炲埌綰跨▼姹犳椂,鍙堟湁涓涓繛鎺lientC榪炲叆,涓葷▼搴忓啀鎶曢掍竴涓噸鍙犺鎿嶄綔,璇繪搷浣滃畬鎴愭椂ThreadB琚縺媧?鍥犱負ThreadA榪樻病鏈夊洖鍒扮嚎紼嬫睜)瀹冩敹鍒頒竴涓狧TTP GET鍛戒護,鐒跺悗ThreadB浣跨敤閲嶅彔鍐欐搷浣滃彂閫佷竴涓綉欏電粰ClientC,鐒跺悗ThreadB鍥炲埌綰跨▼姹?榪欐椂ThreadA涔熷洖鍒頒簡綰跨▼姹?

鍙互鎯寵薄鐜板湪鏈変笁涓寕璧風殑鍙戦佹搷浣滃垎鍒槸ThreadA鍙戦佺粰ClientA鍜孋lientB鐨勭綉欏?浠ュ強ThreadB鍙戦佺粰ClientC鐨勭綉欏?瀹冧滑鐢辨搷浣滅郴緇熷唴鏍告潵澶勭悊.ThreadA鍜孴hreadB鐜板湪宸茬粡鍥炲埌綰跨▼姹?鍙互緇х畫涓哄叾瀹冧換浣曞鎴風鏈嶅姟.

褰撳ClientA鐨勯噸鍙犲啓鎿嶄綔宸茬粡瀹屾垚,ThreadA(涔熷彲浠ユ槸ThreadB)鍙堣嬋媧誨畠鍏抽棴涓嶤lientA榪炴帴,浣嗚繕娌℃湁鍥炲埌綰跨▼姹?涓庢鍚屾椂鍙戦佺粰ClientB鐨勯噸鍙犲啓鎿嶄綔涔熷畬鎴?ThreadB琚縺媧?鍥犱負ThreadA榪樻病鏈夊洖鍒扮嚎紼嬫睜)瀹冨叧闂笌ClientB鐨勮繛鎺?鐒跺悗鍥炲埌綰跨▼姹?榪欐椂ClientC鐨勫啓鎿嶄綔涔熷畬鎴?ThreadB鍐嶆琚縺媧?鍥犱負ThreadA榪樻槸娌℃湁鍥炲埌綰跨▼姹?,瀹冨啀鍏抽棴涓嶤lientC鐨勮繛鎺?榪欐椂ThreadA鍥炲埌綰跨▼姹?ThreadB涔熷洖鍒扮嚎紼嬫睜.榪欐椂瀵逛笁涓鎴風鐨勬湇鍔″叏閮ㄥ畬鎴?鍙互鐪嬪埌鍦ㄦ暣涓湇鍔¤繃紼嬩腑,"寤虹珛榪炴帴","璇繪暟鎹?,"鍐欐暟鎹?鍜?鍏抽棴榪炴帴"絳夋搷浣滄槸閫昏緫涓婅繛緇屽疄闄呬笂鍒嗗紑鐨?

鍒扮幇鍦ㄤ負姝袱涓嚎紼嬪鐞嗕簡涓夋璇繪搷浣滃拰涓夋鍐欐搷浣?鍦ㄨ繖浜涜鍐欐搷浣滆繃紼嬩腑鎵鍑虹幇鐨勭姸鎬佹満(state machine)鏄瘮杈冨鏉傜殑,鎴戜滑妯℃嫙鐨勬槸緇忚繃鎴戠畝鍖栬繃鐨?瀹為檯涓婄殑鐘舵佽姣旇繖涓繕瑕佸鏉傚緢澶?鐒惰岃繖鏍風殑鏈嶅姟绔ā鍨嬪湪瀹㈡埛绔姹傝秺澶氭椂涓庡墠涓や釜妯″瀷鐩告瘮鐨勬ц兘瓚婇珮.鑰屼嬌鐢ㄥ畬鎴愮鍙f垜浠彲浠ュ緢瀹規槗瀹炵幇榪欐牱鐨勬湇鍔″櫒妯″瀷.

寰蔣鐨処IS WEB鏈嶅姟鍣ㄥ氨鏄嬌鐢ㄨ繖鏍風殑鏈嶅姟绔ā鍨?寰堝浜鴻浠涔堥樋甯曞鏈嶅姟鍣ㄦ瘮IIS鐨勬ц兘濂戒粈涔堜粈涔堢殑鎴戣〃紺烘鐤?闄ら潪闃垮笗濂囨湇鍔″櫒鍙互灝嗙嚎紼嬪垎鍓叉垚,涓烘洿灝忕殑鍗曞厓鏈嶅姟,鎴戣寰椾笉澶彲鑳?榪欑瀹屾垚绔彛妯″瀷宸茬粡灝嗗崟涓鎴栧啓鎿嶄綔浣滀負鏈灝忕殑鏈嶅姟鍗曞厓,鎴戣寰楀湪鐩稿悓鏈哄櫒閰嶇疆鐨勬儏鍐典笅IIS鐨勬ц兘瑕佽繙榪滈珮浜庡叾瀹僕EB鏈嶅姟鍣?榪欎篃鏄粠瀹炵幇鏈虹悊涓婃潵鍒嗘瀽鐨?濡傛灉鍑虹幇鎬ц兘涓婄殑宸埆鍙兘鏄湪涓嶅悓鐨勬搷浣滅郴緇熶笂,涔熻Linux鐨勫唴鏍告瘮Windows鐨勮濂?鏈変漢鐪熺殑鐮旂┒榪囧悧?榪樻槸澶у涓璧峰湪鐐掍綔鍟?

瀵逛簬鐘舵佹満姒傚康,鍦ㄥ緢澶氭柟闈㈤兘鐢ㄥ埌,TCPIP涓湁,緙栬瘧鍘熺悊涓湁,OpengGL涓湁絳夌瓑,鎴戠殑紱繪暎鏁板涓嶅ソ(鎴戞槸浼氳涓撲笟涓嶅榪欎釜),涓嶈繃榪樻槸鎼炴噦浜嗕簺,鎴戞兂濡傛灉浣犲鑺變簺鏃墮棿鐪?榪樻槸鍙互鎼炴噦鐨?鏈鍚庢槸涓涓畝鍗曠殑鏂囦歡浼犺緭鏈嶅姟鍣ㄧ▼搴忎唬鐮?鍙敤浜嗕袱涓嚎紼?鎴戠殑鏈哄櫒閲屽彧鏈変竴鍧桟PU)灝卞彲浠ユ湇鍔″涓鎴風.鎴戣皟璇曟椂鐢ㄥ畠鍚屾椂涓?涓猲c瀹㈡埛绔彁渚涙枃浠朵笅杞芥湇鍔¢兘娌℃湁闂,褰撶劧鏇村涔熶笉浼氭湁闂,鍙槸鐣ヤ負浣跨敤浜嗕竴涓婲T 5鐨勭嚎紼嬫睜鍜屽畬鎴愮鍙f妧鏈氨鍙互鏈夎繖鏍烽珮鐨勬ц兘,鏇翠笉鐢ㄨIIS鐨勬ц兘鍜?

甯屾湜澶у涓嶈闄峰湪榪欎釜紼嬪簭鐨勬鏋朵腑,Ctrl+C,Ctrl+V娌℃湁浠涔堟剰涔?瑕佺悊瑙e畠鐨勫疄璐?紼嬪簭浣跨敤Visual C++ 6.0 SP5+2003 Platform SDK緙栬瘧閫氳繃,鍦╓indows XP Professional涓嬭皟璇曡繍琛岄氳繃.紼嬪簭榪愯鐨勬渶浣庤姹傛槸Windows 2000鎿嶄綔緋葷粺.

/********************************************************************
  created:   2005/12/24
  created:   24:12:2005   20:25
  modified:   2005/12/24
  filename:   d:\vcwork\iocomp\iocomp.cpp
  file path:   d:\vcwork\iocomp
  file base:   iocomp
  file ext:   cpp
  author:     kruglinski(kruglinski_at_gmail_dot_com)
 
  purpose:   鍒╃敤瀹屾垚绔彛鎶鏈疄鐜扮殑楂樻ц兘鏂囦歡涓嬭澆鏈嶅姟紼嬪簭
*********************************************************************/

#define _WIN32_WINNT   0x0500

#include <cstdlib>
#include <clocale>
#include <ctime>
#include <iostream>//涓浣跨敤杈撳叆杈撳嚭嫻佺▼搴忛】鏃跺澶?0K
#include <vector>
#include <algorithm>
#include <winsock2.h>
#include <mswsock.h>

using namespace std;

#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"mswsock.lib")

const int MAX_BUFFER_SIZE=1024;
const int PRE_SEND_SIZE=1024;
const int QUIT_TIME_OUT=3000;
const int PRE_DOT_TIMER=QUIT_TIME_OUT/80;

typedef enum{IoTransFile,IoSend,IoRecv,IoQuit} IO_TYPE;

typedef struct
{
  SOCKET hSocket;
  SOCKADDR_IN ClientAddr;
}PRE_SOCKET_DATA,*PPRE_SOCKET_DATA;

typedef struct
{
  OVERLAPPED   oa;
  WSABUF     DataBuf;
  char     Buffer[MAX_BUFFER_SIZE];
  IO_TYPE     IoType;
}PRE_IO_DATA,*PPRE_IO_DATA;

typedef vector<PPRE_SOCKET_DATA>   SocketDataVector;
typedef vector<PPRE_IO_DATA>     IoDataVector;

SocketDataVector   gSockDataVec;
IoDataVector     gIoDataVec;

CRITICAL_SECTION   csProtection;

char* TimeNow(void)
{
  time_t t=time(NULL);
  tm *localtm=localtime(&t);
  static char timemsg[512]={0};
 
  strftime(timemsg,512,"%Z: %B %d %X,%Y",localtm);
  return timemsg;
}

BOOL TransFile(PPRE_IO_DATA pIoData,PPRE_SOCKET_DATA pSocketData,DWORD dwNameLen)
{
  //榪欎竴鍙ユ槸涓簄c鍋氱殑,浣犲彲浠ヤ慨鏀瑰畠
  pIoData->Buffer[dwNameLen-1]='\0';
 
  HANDLE hFile=CreateFile(pIoData->Buffer,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
  BOOL bRet=FALSE;

  if(hFile!=INVALID_HANDLE_VALUE)
  {
    cout<<"Transmit File "<<pIoData->Buffer<<" to client"<<endl;
    pIoData->IoType=IoTransFile;
    memset(&pIoData->oa,0,sizeof(OVERLAPPED));
    *reinterpret_cast<HANDLE*>(pIoData->Buffer)=hFile;
    TransmitFile(pSocketData->hSocket,hFile,GetFileSize(hFile,NULL),PRE_SEND_SIZE,reinterpret_cast<LPOVERLAPPED>(pIoData),NULL,TF_USE_SYSTEM_THREAD);
    bRet=WSAGetLastError()==WSA_IO_PENDING;
  }
  else
    cout<<"Transmit File "<<"Error:"<<GetLastError()<<endl;

  return bRet;
}

DWORD WINAPI ThreadProc(LPVOID IocpHandle)
{
  DWORD dwRecv=0;
  DWORD dwFlags=0;
 
  HANDLE hIocp=reinterpret_cast<HANDLE>(IocpHandle);
  DWORD dwTransCount=0;
  PPRE_IO_DATA pPreIoData=NULL;
  PPRE_SOCKET_DATA pPreHandleData=NULL;

  while(TRUE)
  {
    if(GetQueuedCompletionStatus(hIocp,&dwTransCount,
        reinterpret_cast<LPDWORD>(&pPreHandleData),
        reinterpret_cast<LPOVERLAPPED*>(&pPreIoData),INFINITE))
    {
        if(0==dwTransCount&&IoQuit!=pPreIoData->IoType)
        {
          cout<<"Client:"
            <<inet_ntoa(pPreHandleData->ClientAddr.sin_addr)
            <<":"<<ntohs(pPreHandleData->ClientAddr.sin_port)
            <<" is closed"<<endl;

          closesocket(pPreHandleData->hSocket);

          EnterCriticalSection(&csProtection);
            IoDataVector::iterator itrIoDelete=find(gIoDataVec.begin(),gIoDataVec.end(),pPreIoData);
            gIoDataVec.erase(itrIoDelete);
            SocketDataVector::iterator itrSockDelete=find(gSockDataVec.begin(),gSockDataVec.end(),pPreHandleData);
            gSockDataVec.erase(itrSockDelete);
          LeaveCriticalSection(&csProtection);

          delete *itrIoDelete;
          delete *itrSockDelete;
         
          continue;
        }
       
        switch(pPreIoData->IoType){
        case IoTransFile:
          cout<<"Client:"
            <<inet_ntoa(pPreHandleData->ClientAddr.sin_addr)
            <<":"<<ntohs(pPreHandleData->ClientAddr.sin_port)
            <<" Transmit finished"<<endl;
          CloseHandle(*reinterpret_cast<HANDLE*>(pPreIoData->Buffer));
          goto LRERECV;
         
        case IoSend:
          cout<<"Client:"
            <<inet_ntoa(pPreHandleData->ClientAddr.sin_addr)
            <<":"<<ntohs(pPreHandleData->ClientAddr.sin_port)
            <<" Send finished"<<endl;

LRERECV:
          pPreIoData->IoType=IoRecv;
          pPreIoData->DataBuf.len=MAX_BUFFER_SIZE;
          memset(&pPreIoData->oa,0,sizeof(OVERLAPPED));

          WSARecv(pPreHandleData->hSocket,&pPreIoData->DataBuf,1,
            &dwRecv,&dwFlags,
            reinterpret_cast<LPWSAOVERLAPPED>(pPreIoData),NULL);

          break;

        case IoRecv:
          cout<<"Client:"
            <<inet_ntoa(pPreHandleData->ClientAddr.sin_addr)
            <<":"<<ntohs(pPreHandleData->ClientAddr.sin_port)
            <<" recv finished"<<endl;
          pPreIoData->IoType=IoSend;
         
          if(!TransFile(pPreIoData,pPreHandleData,dwTransCount))
          {
            memset(&pPreIoData->oa,0,sizeof(OVERLAPPED));
            strcpy(pPreIoData->DataBuf.buf,"File transmit error!\r\n");
            pPreIoData->DataBuf.len=strlen(pPreIoData->DataBuf.buf);
           
            WSASend(pPreHandleData->hSocket,&pPreIoData->DataBuf,1,
                &dwRecv,dwFlags,
                reinterpret_cast<LPWSAOVERLAPPED>(pPreIoData),NULL);
          }
          break;
         
        case IoQuit:
          goto LQUIT;
         
        default:
          ;
        }
    }  
  }
 
LQUIT:
  return 0;
}

HANDLE hIocp=NULL;
SOCKET hListen=NULL;

BOOL WINAPI ShutdownHandler(DWORD dwCtrlType)
{
  PRE_SOCKET_DATA PreSockData={0};
  PRE_IO_DATA PreIoData={0};

  PreIoData.IoType=IoQuit;

  if(hIocp)
  {
    PostQueuedCompletionStatus(hIocp,1,
        reinterpret_cast<ULONG_PTR>(&PreSockData),
        reinterpret_cast<LPOVERLAPPED>(&PreIoData));

    cout<<"Shutdown at "<<TimeNow()<<endl<<"wait for a moment please"<<endl;
   
    //璁╁嚭CPU鏃墮棿,璁╃嚎紼嬮鍑?br>    for(int t=0;t<80;t+=1)
    {
        Sleep(PRE_DOT_TIMER);
        cout<<".";
    }
   
    CloseHandle(hIocp);
  }
 
  int i=0;

  for(;i<gSockDataVec.size();i++)
  {
    PPRE_SOCKET_DATA pSockData=gSockDataVec[i];
    closesocket(pSockData->hSocket);
    delete pSockData;
  }

  for(i=0;i<gIoDataVec.size();i++)
  {
    PPRE_IO_DATA pIoData=gIoDataVec[i];
    delete pIoData;
  }

  DeleteCriticalSection(&csProtection);
  if(hListen)
    closesocket(hListen);

  WSACleanup();
  exit(0);
  return TRUE;
}

LONG WINAPI MyExceptionFilter(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
  ShutdownHandler(0);
  return EXCEPTION_EXECUTE_HANDLER;
}

u_short DefPort=8182;

int main(int argc,char **argv)
{
  if(argc==2)
    DefPort=atoi(argv[1]);

  InitializeCriticalSection(&csProtection);
  SetUnhandledExceptionFilter(MyExceptionFilter);
  SetConsoleCtrlHandler(ShutdownHandler,TRUE);

  hIocp=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0);

  WSADATA data={0};
  WSAStartup(0x0202,&data);

  hListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  if(INVALID_SOCKET==hListen)
  {
    ShutdownHandler(0);
  }
 
  SOCKADDR_IN addr={0};
  addr.sin_family=AF_INET;
  addr.sin_port=htons(DefPort);
 
  if(bind(hListen,reinterpret_cast<PSOCKADDR>(&addr),
    sizeof(addr))==SOCKET_ERROR)
  {
    ShutdownHandler(0);
  }
 
  if(listen(hListen,256)==SOCKET_ERROR)
    ShutdownHandler(0);

  SYSTEM_INFO si={0};
  GetSystemInfo(&si);
  si.dwNumberOfProcessors<<=1;

  for(int i=0;i<si.dwNumberOfProcessors;i++)
  {
   
    QueueUserWorkItem(ThreadProc,hIocp,WT_EXECUTELONGFUNCTION);
  }
 
  cout<<"Startup at "<<TimeNow()<<endl
    <<"work on port "<<DefPort<<endl
    <<"press CTRL+C to shutdown"<<endl<<endl<<endl;

  while(TRUE)
  {
    int namelen=sizeof(addr);
    memset(&addr,0,sizeof(addr));
    SOCKET hAccept=accept(hListen,reinterpret_cast<PSOCKADDR>(&addr),&namelen);

    if(hAccept!=INVALID_SOCKET)
    {
        cout<<"accept a client:"<<inet_ntoa(addr.sin_addr)<<":"<<ntohs(addr.sin_port)<<endl;

        PPRE_SOCKET_DATA pPreHandleData=new PRE_SOCKET_DATA;
        pPreHandleData->hSocket=hAccept;
        memcpy(&pPreHandleData->ClientAddr,&addr,sizeof(addr));
       
        CreateIoCompletionPort(reinterpret_cast<HANDLE>(hAccept),
          hIocp,reinterpret_cast<DWORD>(pPreHandleData),0);
       
        PPRE_IO_DATA pPreIoData=new(nothrow) PRE_IO_DATA;

        if(pPreIoData)
        {
          EnterCriticalSection(&csProtection);
            gSockDataVec.push_back(pPreHandleData);
            gIoDataVec.push_back(pPreIoData);
          LeaveCriticalSection(&csProtection);

          memset(pPreIoData,0,sizeof(PRE_IO_DATA));
          pPreIoData->IoType=IoRecv;
          pPreIoData->DataBuf.len=MAX_BUFFER_SIZE;
          pPreIoData->DataBuf.buf=pPreIoData->Buffer;
          DWORD dwRecv=0;
          DWORD dwFlags=0;
          WSARecv(hAccept,&pPreIoData->DataBuf,1,
            &dwRecv,&dwFlags,
            reinterpret_cast<WSAOVERLAPPED*>(pPreIoData),NULL);
        }
        else
        {
          delete pPreHandleData;
          closesocket(hAccept);
        }
    }
  }
 
  return 0;
}

鍙傝冭祫鏂?
銆奙SDN 2001銆?br>銆奧indows 緗戠粶緙栫▼銆?br>銆奧indows 鏍稿績緙栫▼銆?br>銆奣CP/IP璇﹁В銆?/font>


]]>
socket緙栫▼鈥旀妧鏈疄鐜?http://www.shnenglu.com/amyvmiwei/archive/2008/01/17/41375.html灝忎笉鐐?/dc:creator>灝忎笉鐐?/author>Thu, 17 Jan 2008 14:22:00 GMThttp://www.shnenglu.com/amyvmiwei/archive/2008/01/17/41375.htmlhttp://www.shnenglu.com/amyvmiwei/comments/41375.htmlhttp://www.shnenglu.com/amyvmiwei/archive/2008/01/17/41375.html#Feedback0http://www.shnenglu.com/amyvmiwei/comments/commentRss/41375.htmlhttp://www.shnenglu.com/amyvmiwei/services/trackbacks/41375.html浠涔堟槸socket錛焥ocket灝辨槸...錛屾垜鍦ㄨ繖閲屽氨涓嶆妱涔︿簡錛屾湁鍏磋叮鐨勫悓浠佸幓鏌ユ煡涔﹀惂銆?br>涓嶈繃榪樿璇翠竴鍙ワ紝socket灝辨槸涓嶅悓榪涚▼涔嬮棿鐨勪竴縐嶉氫俊鏂瑰紡銆傚氨璞℃墦鐢佃瘽鏄湅鍙嬩箣闂寸殑涓縐嶉氫俊鏂瑰紡鏄竴鏍楓備釜浜虹悊瑙o細鎵璋?#8220;閫氫俊”錛屽氨鏄浉浜掍箣闂村彂閫佹暟鎹傛湁浜虹悊瑙ocket鏄笉鍚岃綆楁満涔嬮棿鐨勪竴縐嶉氫俊鏂?br>寮忥紝榪欐槸涓嶇‘鍒囩殑銆備袱涓繘紼嬶紝涓嶇鏄繍琛屽湪鍚屼竴鍙拌綆楁満涓婏紝榪樻槸榪愯鍦ㄤ笉鍚岃綆楁満涓婏紝閮藉彲閫氳繃
socket鎶鏈繘琛岄氫俊銆?br>
socket濂楁帴瀛楃殑浣跨敤闇瑕佹湁緗戝崱鐨勬敮鎸侊紝鎵浠ocket涓鑸兘琚敤鏉ュ湪涓嶅悓鏈哄櫒涔嬮棿閫氫俊錛岃屽鏋滃湪鍚屼竴鍙拌綆楁満涓婄殑涓や釜榪涚▼榪涜閫氫俊錛岄氬父閲囩敤鏁堢巼鏇撮珮鐨勫叡浜唴瀛樻妧鏈潵瀹炵幇銆?br>
涓や釜榪涚▼涔嬮棿榪涜閫氳錛屽氨闇瑕佷袱涓繘紼嬪悓鏃墮兘鍦ㄨ繍琛屼簡錛堝簾璇濓級錛屽湪鍏蜂綋瀹炵幇涓紝涓や釜榪涚▼鎴戜滑閫氬父瑕佸尯鍒寰咃紝涓涓繘紼嬩笓闂ㄧ瓑寰呭彟涓涓繘紼嬬粰鑷繁鍙戞秷鎭紝鏀跺埌娑堟伅鍚庤繘琛屽鐞嗭紝鍦ㄦ妸澶勭悊緇撴灉鍙戦佸洖鍘匯傛垜浠妸涓撻棬澶勭悊娑堟伅銆佹彁渚涙湇鍔$殑榪涚▼縐頒負鏈嶅姟鍣ㄧ錛屾妸鍙戦佹秷鎭佽姹傚鐞嗙殑榪涚▼縐頒負瀹㈡埛绔傛諱綋榪囩▼灝辨槸瀹㈡埛绔彂閫佷竴涓秷鎭粰鏈嶅姟鍣ㄧ錛屾湇鍔″櫒绔繘紼嬫敹鍒版秷鎭繘琛屽鐞嗭紝鎶婂鐞嗙粨鏋滃彂閫佺粰瀹㈡埛绔傛仼錛屽氨鏄繖鏍楓?br>
榪樻湁涓涓棶棰橈紝濡傛灉鎴戠幇鍦ㄦ湁涓涓繘紼嬭璺熷彟涓鍙拌綆楁満涓婄殑鏌愪釜榪涚▼榪涜socket閫氫俊錛岄偅鍦ㄦ垜榪欎釜榪涚▼涓浣曟寚瀹氬彟涓涓繘紼嬪憿錛熻繖閲岃繕闇瑕佽涓涓嬪彟涓涓蹇碘斺旂鍙o紝濡傛灉鎶婃搷浣滅郴緇熸瘮浣滀竴搴ф埧瀛愮殑璇濓紝閭g鍙e氨鏄埧瀛愮殑紿楀彛錛屾槸緋葷粺澶栫晫鍚岀郴緇熷唴閮ㄨ繘琛岄氫俊鐨勯氶亾銆傚湪socket瀹炵幇涓紝鎴戜滑涓嶈繘琛屽彟涓涓繘紼嬬殑鎸囧畾錛岃屾槸鎸囧畾鍙戦佹秷鎭垨鎺ユ敹娑堟伅鐨勭鍙e彿銆傛瘮濡傝鐜板湪榪涚▼A瑕佺粰榪涚▼B鍙戞秷鎭紝鎴戜滑浼氭妸娑堟伅鍙戦佸埌榪涚▼B鎵榪愯鐨勮綆楁満鐨勭鍙涓婏紝鑰岃繘紼婤姝ゆ椂姝e湪鐩戣绔彛N錛岃繖鏍瘋繘紼婤灝辮兘鏀跺埌榪涚▼A鍙戦佹潵鐨勬暟鎹紝鍚屾牱榪涚▼B涔熸妸娑堟伅鍙戦佸埌璇ョ鍙d笂錛岃繘紼婣涔熻兘浠庤绔彛鏀跺埌榪涚▼B鍙戦佹潵鐨勬暟鎹紝褰撶劧錛岃繖闇瑕佸鎴風鍜屾湇鍔″櫒绔叧浜庣鍙e彿榪涜涓涓害瀹氾紝鍗沖叡鍚屾搷浣滃悓涓涓鍙c傚鏋滃鎴風鎶婃秷鎭彂閫佸埌绔彛N1涓婏紝鑰屾湇鍔″櫒绔洃瑙嗙殑鏄鍙2錛岄偅閫氫俊涓瀹氫笉鑳芥垚鍔熴傜鍙e彿鏈澶т負65535錛屼笉鑳芥瘮榪欎釜鍐嶅ぇ浜嗭紝浣嗗湪鎴戜滑鑷繁鐨勭▼搴忎腑灝介噺涓嶈鐢ㄥ皬浜?024鐨勭鍙e彿錛屽皬浜?024鐨勭鍙eソ寰堝閮借緋葷粺浣跨敤浜嗭紝姣斿23琚玹elnet鎵浣跨敤銆?br>
socket鐨勫疄鐜版槸寰堢畝鍗曠殑錛屽彧瑕佹寜鐓т竴瀹氱殑姝ラ錛屽氨鍙┈涓婂緩绔嬩竴涓繖鏍風殑閫氫俊閫氶亾銆?br>
涓嬮潰杈冭緇嗙殑浠嬬粛鍑犱釜鏍稿績鐨勫嚱鏁幫細

SOCKET socket(int af, int type, int protocol);
鏃犺鏄鎴風榪樻槸鏈嶅姟鍣ㄧ錛屼笅闈㈣繖涓嚱鏁版槸涓瀹氳鐢ㄥ埌鐨勶紝涔熸槸鏈鍏堢敤鍒扮殑銆?br>榪欎釜鍑芥暟鏄鍛婅瘔緋葷粺錛岀粰鎴戝噯澶囧ソ涓涓猻ocket閫氶亾錛屾垜瑕佸拰鍏跺畠榪涚▼閫氫俊浜嗐傚嚱鏁扮殑榪斿洖鍊煎緢閲嶈錛屾垜浠璁頒笅鏉ワ紝瀹冭〃紺虹郴緇熶負鎴戜滑鍑嗗濂界殑榪欎釜socket閫氶亾錛屽湪浠ュ悗鐨勬瘡涓猻ocket鐩稿叧鍑芥暟涓兘浼氱敤鍒幫紝濡傛灉榪欎釜鍊肩瓑浜嶴OCKET_ERROR錛岃〃紺哄嚱鏁版墽琛屽け璐ヤ簡銆傚嚱鏁扮殑鍙傛暟鎴戜滑鍒嗗埆緇欙細PF_INET銆丼OCK_STREAM鍜孖PPROTO_TCP銆?br>
int bind(SOCKET s, const sockaddr *addr, int namelen);
榪欎釜鍑芥暟鍙湁鏈嶅姟鍣ㄧ紼嬪簭浣跨敤錛屼綔鐢ㄦ槸涓庢煇涓猻ocket閫氶亾緇戝畾銆傚彲浠ョ敤榪斿洖鍊煎垽鏂鍑芥暟鎵ц緇撴灉鎬庝箞鏍鳳紝濡傛灉絳変簬SOCKET_ERROR錛岄偅灝辨槸澶辮觸浜嗐傜涓涓弬鏁皊錛屽氨鏄痵ocket()鍑芥暟鐨勮繑鍥炲鹼紱鍦ㄧ粨鏋刟ddr涓紝鎴戜滑瑕佺粰瀹氫竴涓鍙e彿錛沶amelen絳変簬緇撴瀯sockaddr鐨勫ぇ灝忋?br>
int listen(SOCKET s, int backlog);
榪欎釜鍑芥暟鍙湁鏈嶅姟鍣ㄧ紼嬪簭浣跨敤錛屼綔鐢ㄦ槸鐩戝惉璇ョ鍙c傝繑鍥炲間笌bind鍑芥暟鎰忎箟涓鏍楓?br>
int accept(SOCKET s, sockaddr *addr, int *addrlen);
榪欎釜鍑芥暟鍙湁鏈嶅姟鍣ㄧ紼嬪簭浣跨敤錛屼綔鐢ㄦ槸鍝嶅簲瀹㈡埛绔殑榪炴帴銆傝繑鍥炲間笌bind鍑芥暟鎰忎箟涓鏍楓?br>
int connect(SOCKET s, const sockaddr *name, int namelen);
榪欎釜鍑芥暟鍙湁瀹㈡埛绔▼搴忎嬌鐢紝浣滅敤鏄妸瀹㈡埛绔拰鏌愪釜璁$畻鏈虹殑鏌愪釜绔彛寤虹珛榪炴帴銆傝繑鍥炲間笌bind鍑芥暟鎰忎箟涓鏍楓傜涓涓弬鏁皊錛屽氨鏄痵ocket()鍑芥暟鐨勮繑鍥炲鹼紱鍦ㄧ粨鏋刵ame涓紝鎴戜滑瑕佺粰瀹氫竴涓鍙e彿鍜岀洰鐨勬満鍣ㄥ悕錛沶amelen絳変簬緇撴瀯sockaddr鐨勫ぇ灝忋?br>
int send(SOCKET s, char *buf, int len, int flags);
int recv(SOCKET s, char *buf, int len, int flags);
榪欎袱涓嚱鏁板氨鏄彂閫佹暟鎹拰鎺ユ敹鏁版嵁錛屽鎴風鍜屾湇鍔″櫒绔▼搴忛兘鑳界敤錛屽摢涓彂閫佸摢涓帴鏀朵笉鐢ㄨ浜嗗惂錛熷懙鍛點?br>浠庡嚱鏁扮殑榪斿洖鍊煎彲浠ユ鏌ュ嚱鏁版墽琛屾槸鍚︽垚鍔熴傚弬鏁頒腑buf鏄寚鍚戝彂閫佹垨鎺ユ敹鐨勬暟鎹殑鎸囬拡錛宭en鏄暟鎹暱搴︺俧lags鎴戜滑緇欎釜0灝卞彲浠ワ紙鍏跺疄鏄垜涓嶇煡閬撳叿浣撳惈涔夛級銆?br>
鏈鍚庡氨鏄叧闂璼ocket浜嗭紝榪欎釜寰堝鏄撳繕鎺夛紝浣嗚繖涓嚱鏁板緢閲嶈錛屼竴瀹氳鐢ㄣ?br>int closesocket(SOCKET s);


濂戒簡錛屽叧閿嚱鏁板氨榪欎箞鍑犱釜錛屼笅鍥炬槸榪欏嚑涓嚱鏁扮殑鎵ц欏哄簭錛?br>
client绔?service绔?br>
  |                    |
  v                 v
socket()       socket()
  |                          |
  |                          v
  |                        bind()
  |                          |
  |                          v
  |                        listen()
  |                          |
  |                          v
  |                        accept() 鎸傝搗錛岀洿鍒版湁瀹㈡埛绔潵榪炴帴
  |                          |
  v                  涓夋鎻℃墜榪囩▼   |
connect()       <-------------> |
  |                       |
  v   鍙戦佹秷鎭?  v
  +---> send() ---------------> recv() <-------+
  |   |     . |
  |   |     . 澶勭悊娑堟伅 |
  |   v   鍝嶅簲娑堟伅   . |
  +---- recv() <--------------- send() --------+
  |     |
  v     |
close() ---------------> recv()
    |
    v
  closesocket()

涓婂浘鎴戣寰楄兘寰堝ソ鐨勮鏄庡鎴風鍜屾湇鍔″櫒绔殑榪愯杞ㄨ抗銆?br>
浣跨敤浠ヤ笂鍑犱釜鍑芥暟鍦?linux 緋葷粺涓婂氨鍙垚鍔熷緩绔嬩竴涓猻ocket閫氫俊榪炶礬錛屼絾濡傛灉鍦╳indows緋葷粺涓婏紝榪樿鐢ㄥ埌鍙︿竴涓嚱鏁幫細
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
鍦╳indows緋葷粺涓婏紝棣栧厛瑕佹墽琛岃繖涓嚱鏁幫紝鎵浠ヨ鎶婅繖涓嚱鏁版斁鍦╯ocket()鍑芥暟鐨勫墠闈€?br>
鎴戝涓婇潰鐨勫嚱鏁拌繘琛屼簡涓浜涘皝瑁咃紝涓鴻妭鐪佺瘒騫咃紝鎴戝幓鎺夋墍鏈夋敞閲婂拰闈為噸瑕佺殑鍑芥暟錛屽湪榪欓噷鍙互鐪嬪埌鍚勪釜鍑芥暟鐨勫叿浣撶敤娉曪細

鍦?VC60 鐜涓嬭榪愯涓嬮潰鐨勫嚱鏁幫紝瑕佸寘鍚ご鏂囦歡 errno.h 鍜?winsock2.h錛岃繕鏈夛紝鍦ㄨ繛鎺ョ殑鏃跺欒榪炴帴涓妛s2_32.dll鏂囦歡銆?br>
榪欐槸澶存枃浠跺唴瀹癸細
class Socket {
public:

bool setup();

void close();

bool connect(string host, int port);

bool listen();

int accept();

int recv(char *buf, int len);

int recv(int new_fd, char *buf, int len);

int send(const char *msg, int len);

int send(int new_fd, const char *msg, int len);

private:
  int _fd;
};

榪欐槸瀹炵幇鏂囦歡鍐呭錛?br>bool Socket::setup() {

WSADATA wsd;
_fd = WSAStartup(MAKEWORD(2,2), &wsd);
if(_fd) {
return false;
}

_fd = ::socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (_fd == -1) {
return false;
}
return true;
}

bool Socket::listen() {
struct sockaddr_in my_addr;

my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(52309);
my_addr.sin_addr.s_addr = INADDR_ANY;

if(::bind(_fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == SOCKET_ERROR) {
return false;
}

if(::listen(_fd, BACKLOG) == SOCKET_ERROR) {
return false;
}

return true;
}

int Socket::accept()
{
int new_fd;
struct sockaddr_in their_addr;
int sin_size = sizeof(their_addr);

printf("accepting... \n");

new_fd = ::accept(_fd,
  (struct sockaddr *)&their_addr,
  &sin_size);
return new_fd == SOCKET_ERROR ? -1:new_fd;
}

bool Socket::connect(string host, int port) {
struct hostent *_h = gethostbyname(host.c_str());
if (_h == 0) {
return false;
}

struct in_addr *_addr = (struct in_addr *)_h->h_addr;
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_addr = *_addr;
sin.sin_port = htons(port);

if (::connect(_fd, (sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR) {
return false;
}

return true;
}

int Socket::recv(int new_fd, char *buf, int len)
{
int nb = ::recv(new_fd, buf, len, 0);
if (nb == -1) {
printf("Error! recv.\n");
}
return nb;
}

int Socket::recv(char *buf, int len) {
return recv(_fd, buf, len);
}

int Socket::send(const char *msg, int len) {
return send(_fd, msg, len);
}

int Socket::send(int new_fd, const char *msg, int len)
{
int nb = ::send(new_fd, msg, len, 0);
if (nb == -1) {
printf("Error! send.\n");
}

return nb;
}

void Socket::close() {

int trytimes = 0;
while(::closesocket(_fd) && trytimes < CLOSE_TRY_TIMES)
trytimes++;

if(trytimes == 10) {
printf("Cannot close socket!\n");
}
}

濂斤紝socket綾繪槸灝佽濂戒簡錛屼笅闈㈠氨鏄粍緇囦簡錛屾湇鍔″櫒绔拰瀹㈡埛绔槸涓嶄竴鏍風殑錛屼笅闈㈠垎鍒粰鍑轟唬鐮侊紝鍒拌繖閲屽凡緇忓氨寰堢畝鍗曚簡銆?br>
瀹㈡埛绔細
int main(int argc, char **argv)
{
printf("socket of client is run ...\n");
Socket s;
if (!s.connect("dezhi", 52309))
return 0;

char *msg = "ok, send a message.";
for (int i=0; i<10; i++) {
s.send(msg, 20);
printf("message = %s\n", msg);
}
s.send("q", 1);
s.close();

return 0;
}

鏈嶅姟鍣細
int main(int argc, char **argv) {
printf("socket of service is run ...\n");

Socket s;
s.listen();
int new_fd = s.accept();

char buf[8];
buf[7] = '\0';
while (1) {
if (s.recv(new_fd, buf, 5) != -1) {
  printf("%s\n", buf);
  if (buf[0] == 'q')
  break;
}
}
s.close();
}

涓嬮潰涓鴻繍琛岀粨鏋滐細
瀹㈡埛绔細
socket of client is run ...
Socket: WSAStartup success execute.
Socket: socket success execute.
Socket: Establish the connection to "127.0.0.1:52309"
message = ok, send a message.
message = ok, send a message.
message = ok, send a message.
message = ok, send a message.
message = ok, send a message.
message = ok, send a message.
message = ok, send a message.
message = ok, send a message.
message = ok, send a message.
message = ok, send a message.
Socket: Close connection to "127.0.0.1:52309"
Press any key to continue

鏈嶅姟鍣ㄧ
socket of service is run ...
Socket: WSAStartup success execute.
Socket: socket success execute.
bind ok!
listen ok!
accepting...
ok, send a message.
ok, send a message.
ok, send a message.
ok, send a message.
ok, send a message.
ok, send a message.
ok, send a message.
ok, send a message.
ok, send a message.
ok, send a message.
qk, send a message.
Press any key to continue

灝卞埌榪欓噷鍚с俿ocket鐨勭浉鍏沖唴瀹瑰彲榪滀笉姝㈣繖浜涳紝鎴戝湪榪欓噷鍙槸緇欏ぇ瀹舵潵涓姏鐮栧紩鐜夛紝鎯蟲繁絀訛紵璺繕寰堟極闀褲傚叧浜庤緇嗙殑瀹炵幇浠g爜錛屽幓鎴戠殑銆婃簮鐮併嬩笂鎵懼惂錛屼笉鏀懼湪榪欓噷錛屾槸涓轟簡璁╃瘒騫呭皬浜涖?/font>


]]>
Winsock宸ヤ綔妯″瀷 ( 杞?)http://www.shnenglu.com/amyvmiwei/archive/2008/01/17/41365.html灝忎笉鐐?/dc:creator>灝忎笉鐐?/author>Thu, 17 Jan 2008 13:22:00 GMThttp://www.shnenglu.com/amyvmiwei/archive/2008/01/17/41365.htmlhttp://www.shnenglu.com/amyvmiwei/comments/41365.htmlhttp://www.shnenglu.com/amyvmiwei/archive/2008/01/17/41365.html#Feedback0http://www.shnenglu.com/amyvmiwei/comments/commentRss/41365.htmlhttp://www.shnenglu.com/amyvmiwei/services/trackbacks/41365.html棣栧厛寰楀紕娓呮鍚屾銆佸紓姝ャ侀樆濉炪侀潪闃誨鐨勬蹇點?br>鍚屾鍜屽紓姝ユ槸閽堝閫氳鐨勫伐浣滄ā寮忥紝闃誨鍜岄潪闃誨鏄寚socket鐨処/O鎿嶄綔銆?br>瀹為檯涓婂浜巗ocket錛屽彧瀛樺湪闃誨鍜岄潪闃誨錛屽悓姝ヤ笌寮傛鏄湪紼嬪簭瀹炵幇涓婃湁鎵涓嶅悓銆?br>浠ラ樆濉炵殑鏂瑰紡鎵цrecv鍑芥暟錛屽湪娌℃湁鏀跺埌鏁版嵁鍓嶏紝姝ゅ嚱鏁版槸涓嶄細榪斿洖鐨勶紝鎵浠ヨ繖寰堝鏄撴墽琛屽嚱鏁扮殑綰跨▼澶勪簬絳夊緟I/O涓婄殑鏁版嵁鐘舵侊紝鐒跺悗琚寕璧楓傞潪闃誨灝變笉涓鏍鳳紝鎵цrecv鏃跺欎笉綆℃湁娌℃湁鏁版嵁閮界珛鍗寵繑鍥烇紝鏈夋暟鎹椂榪斿洖鏁版嵁錛屾病鏁版嵁鏃惰繑鍥為敊璇傞潪闃誨鍙互甯︽潵紼嬪簭鐨勯珮鏁堬紝涔熷甫鏉ヤ簡鍐欑▼搴忎腑蹇呴』娉ㄦ剰鐨勫湴鏂癸紝闈為樆濉炴儏鍐典笅錛屽彂閫佷笌鎺ユ敹鏁版嵁鏃跺欙紝瑕佺敤鎴瘋嚜宸辯鐞嗚嚜宸辯殑緙撳啿鍖猴紝騫朵笖瑕佽褰曞彂閫佷笌鎺ュ彈鐨勪綅緗紝鍥犱負寰堝彲鑳藉彂閫佷笌鎺ュ彈鏁版嵁鐨勪換鍔′笉鑳戒竴嬈″畬鎴愶紝闇瑕佸嬈¤皟鐢╯end鍜宺ecv鎵嶅彲浠ュ畬鎴愩?br>鏈潵鍚屾寮傛鏄敤鏉ヨ〃紺洪氳妯″紡鐨勶紝閫氫俊鐨勫悓姝ワ紝涓昏鏄寚瀹㈡埛绔湪鍙戦佽姹傚悗錛屽繀欏誨緱鍦ㄦ湇鍔$鏈夊洖搴斿悗鎵嶅彂閫佷笅涓涓姹傘傛墍浠ヨ繖涓椂鍊欑殑鎵鏈夎姹傚皢浼氬湪鏈嶅姟绔緱鍒板悓姝ャ傞氫俊鐨勫紓姝ワ紝鎸囧鎴風鍦ㄥ彂閫佽姹傚悗錛屼笉蹇呯瓑寰呮湇鍔$鐨勫洖搴斿氨鍙互鍙戦佷笅涓涓姹傦紝榪欐牱瀵逛簬鎵鏈夌殑璇鋒眰鍔ㄤ綔鏉ヨ灝嗕細鍦ㄦ湇鍔$寰楀埌寮傛錛岃繖鏉¤姹傜殑閾捐礬灝辮薄鏄竴涓姹傞槦鍒楋紝鎵鏈夌殑鍔ㄤ綔鍦ㄨ繖閲屼笉浼氬緱鍒板悓姝ョ殑銆備絾鏄釜浜烘劅瑙夛紝鍦ㄨ鍒皊ocket鐨勫悓姝ュ紓姝ユ椂鍊欙紝鍚屾璺熼樆濉炴蹇靛樊涓嶅錛岄兘鏄湁浜嗙粨鏋滄墠榪斿洖錛屽紓姝ュ垯鏄憡璇夌郴緇熸垜瑕乺ecv鏁版嵁錛岀劧鍚庨┈涓婅繑鍥烇紝絳夊緟鏁版嵁鏉ヤ簡鍚庯紝緋葷粺璺熺▼搴忚鏁版嵁鍒頒簡錛岀劧鍚庣▼搴忓啀recv鏁版嵁銆傚紩鐢ㄥ湪緗戜笂鐪嬪埌鐨勬瘮杈冨ソ鐨勬弿榪?#8220;闃誨 block 鏄寚錛屼綘鎷ㄩ氭煇浜虹殑鐢佃瘽錛屼絾鏄浜轟笉鍦紝浜庢槸浣犳嬁鐫鐢佃瘽絳変粬鍥炴潵錛屽叾闂翠笉鑳藉啀鐢ㄧ數璇濄傚悓姝ュぇ姒傚拰闃誨宸笉澶氥傞潪闃誨 nonblock 鏄寚錛屼綘鎷ㄩ氭煇浜虹殑鐢佃瘽錛屼絾鏄浜轟笉鍦紝浜庢槸浣犳寕鏂數璇濓紝寰呬細鍎垮啀鎵撱傝嚦浜庡埌鏃跺欎粬鍥炴潵娌℃湁錛屽彧鏈夋墦浜嗙數璇濇墠鐭ラ亾銆傚嵆鎵璋撶殑“杞 / poll”銆傚紓姝ユ槸鎸囷紝浣犳嫧閫氭煇浜虹殑鐢佃瘽錛屼絾鏄浜轟笉鍦紝浜庢槸浣犲彨鎺ョ數璇濈殑浜哄憡璇夐偅浜?leave a message)錛屽洖鏉ュ悗緇欎綘鎵撶數璇濓紙call back錛夈?#8221;

鏄劇劧錛屽紓姝ヨ楂樻晥涓浜涖傚湪Winsock涓疄鐜板紓姝ョ殑鏂規硶鏈夊緢澶氾紝Winsock宸ヤ綔妯″瀷鏈変笅闈㈠叚縐?br>    涓錛歴elect妯″瀷
    浜岋細WSAAsyncSelect妯″瀷
    涓夛細WSAEventSelect妯″瀷
    鍥涳細Overlapped I/O 浜嬩歡閫氱煡妯″瀷
    浜旓細Overlapped I/O 瀹屾垚渚嬬▼妯″瀷
    鍏細IOCP妯″瀷
浠庝竴鍒板叚瓚婃潵瓚婇珮綰э紝瓚婃潵瓚婇珮鏁堬紝瀹炵幇瓚婃潵瓚婂鏉傘傛浘鍦ㄧ綉涓婄湅鍒頒竴浜涙瘮鍠葷敤鏉ュ緢濂界殑璇存槑榪欎簺妯″瀷錛屽湪榪欓噷寮曠敤涓涓嬨?/p>

    鑰侀檲鏈変竴涓湪澶栧湴宸ヤ綔鐨勫コ鍎匡紝涓嶈兘緇忓父鍥炴潵錛岃侀檲鍜屽ス閫氳繃淇′歡鑱旂郴銆備粬浠殑淇′細琚偖閫掑憳鎶曢掑埌浠栦滑鐨勪俊綆遍噷銆?br>涓錛歴elect妯″瀷

鑰侀檲闈炲父鎯崇湅鍒板コ鍎跨殑淇°備互鑷充簬浠栨瘡闅?0鍒嗛挓灝變笅妤兼鏌ヤ俊綆憋紝鐪嬫槸鍚︽湁濂沖効鐨勪俊~~~~~
鍦ㄨ繖縐嶆儏鍐典笅錛?#8220;涓嬫ゼ媯鏌ヤ俊綆?#8221;鐒跺悗鍥炲埌妤間笂鑰借浜嗚侀檲澶鐨勬椂闂達紝浠ヨ嚦浜庤侀檲鏃犳硶鍋氬叾浠栧伐浣溿?/p>

浜岋細WSAAsyncSelect妯″瀷

鍚庢潵錛岃侀檲浣跨敤浜嗗井杞叕鍙哥殑鏂板紡淇$銆傝繖縐嶄俊綆遍潪甯稿厛榪涳紝涓鏃︿俊綆遍噷鏈夋柊鐨勪俊浠訛紝鐩栬尐灝變細緇欒侀檲鎵撶數璇濓細鍠傦紝澶х埛錛屼綘鏈夋柊鐨勪俊浠朵簡錛佷粠姝わ紝鑰侀檲鍐嶄篃涓嶅繀棰戠箒涓婁笅妤兼鏌ヤ俊綆變簡錛岀墮涔熶笉鐤間簡錛屼綘鐬呭噯浜嗭紝钃濆ぉ......涓嶆槸錛屽井杞瘇~~~~~~~

涓夛細WSAEventSelect妯″瀷

鍚庢潵錛屽井杞殑淇$闈炲父鐣呴攢錛岃喘涔板井杞俊綆辯殑浜轟互鐧句竾璁℃暟......浠ヨ嚦浜庣洊鑼ㄦ瘡澶?4灝忔椂緇欏鎴鋒墦鐢佃瘽錛岀瘡寰楄叞閰歌儗鐥涳紝鍠濊殎鍔涚閮戒笉濂戒嬌~~~~~~
寰蔣鏀硅繘浜嗕粬浠殑淇$錛氬湪瀹㈡埛鐨勫涓坊鍔犱竴涓檮鍔犺緗紝榪欎釜瑁呯疆浼氱洃瑙嗗鎴風殑淇$錛屾瘡褰撴柊鐨勪俊浠舵潵涓達紝姝よ緗細鍙戝嚭“鏂頒俊浠跺埌杈?#8221;澹幫紝鎻愰啋鑰侀檲鍘繪敹淇°傜洊鑼ㄧ粓浜庡彲浠ョ潯瑙変簡銆?/p>

鍥涳細Overlapped I/O 浜嬩歡閫氱煡妯″瀷

鍚庢潵錛屽井杞氳繃璋冩煡鍙戠幇錛岃侀檲涓嶅枩嬈笂涓嬫ゼ鏀跺彂淇′歡錛屽洜涓轟笂涓嬫ゼ鍏跺疄寰堟氮璐規椂闂淬備簬鏄井杞啀嬈℃敼榪涗粬浠殑淇$銆傛柊寮忕殑淇$閲囩敤浜嗘洿涓哄厛榪涚殑鎶鏈紝鍙鐢ㄦ埛鍛婅瘔寰蔣鑷繁鐨勫鍦ㄥ嚑妤煎嚑鍙鳳紝鏂板紡淇$浼氭妸淇′歡鐩存帴浼犻佸埌鐢ㄦ埛鐨勫涓紝鐒跺悗鍛婅瘔鐢ㄦ埛錛屼綘鐨勪俊浠跺凡緇忔斁鍒頒綘鐨勫涓簡錛佽侀檲寰堥珮鍏達紝鍥犱負浠栦笉蹇呭啀浜茶嚜鏀跺彂淇′歡浜嗭紒

浜旓細Overlapped I/O 瀹屾垚渚嬬▼妯″瀷

鑰侀檲鎺ユ敹鍒版柊鐨勪俊浠跺悗錛屼竴鑸殑紼嬪簭鏄細鎵撳紑淇″皝----鎺忓嚭淇$焊----闃呰淇′歡----鍥炲淇′歡......涓轟簡榪涗竴姝ュ噺杞葷敤鎴瘋礋鎷咃紝寰蔣鍙堝紑鍙戜簡涓縐嶆柊鐨勬妧鏈細鐢ㄦ埛鍙鍛婅瘔寰蔣瀵逛俊浠剁殑鎿嶄綔姝ラ錛屽井杞俊綆卞皢鎸夌収榪欎簺姝ラ鍘誨鐞嗕俊浠訛紝涓嶅啀闇瑕佺敤鎴蜂翰鑷媶淇?闃呰/鍥炲浜嗭紒鑰侀檲緇堜簬榪囦笂浜嗗皬璧勭敓媧伙紒

鍏細IOCP妯″瀷

寰蔣淇$浼間箮寰堝畬緹庯紝鑰侀檲涔熷緢婊℃剰銆備絾鏄湪涓浜涘ぇ鍏徃鎯呭喌鍗村畬鍏ㄤ笉鍚岋紒榪欎簺澶у叕鍙告湁鏁頒互涓囪鐨勪俊綆憋紝姣忕閽熼兘鏈夋暟浠ョ櫨璁$殑淇′歡闇瑕佸鐞嗭紝浠ヨ嚦浜庡井杞俊綆辯粡甯稿洜瓚呰礋鑽瘋繍杞屽穿婧冿紒闇瑕侀噸鏂板惎鍔紒寰蔣涓嶅緱涓嶄嬌鍑烘潃鎵嬮攺......
寰蔣緇欐瘡涓ぇ鍏徃媧句簡涓鍚嶅悕鍙?#8220;Completion Port”鐨勮秴綰ф満鍣ㄤ漢錛岃榪欎釜鏈哄櫒浜哄幓澶勭悊閭d簺淇′歡錛?/p>


鍏跺疄錛屼笂闈㈡瘡縐嶆ā鍨嬮兘鏈変紭鐐癸紝瑕佹牴鎹▼搴忛渶姹傝岄傚綋閫夋嫨鍚堥傜殑妯″瀷錛屽墠闈笁縐嶆ā鍨嬫晥鐜囧凡緇忔瘮杈冮珮錛屽疄鐜拌搗鏉ラ毦閬撲笉澶э紝寰堝涓鑸殑緗戠粶紼嬪簭閮介噰鐢ㄥ墠涓夌妯″瀷錛屽彧鏈夊緗戠粶瑕佹眰鐗瑰埆楂樼殑涓浜涙湇鍔″櫒鎵嶄細鑰冭檻鐢ㄥ悗闈㈢殑閭d簺妯″瀷銆侻FC涓殑CAsyncSocket綾誨氨鏄敤鐨刉SAAsyncSelect妯″瀷錛岀數椹翠腑涔熸槸鐢ㄧ殑榪欑錛屼笉榪囧湪瀵繪壘瀵瑰簲socket鐨勬椂鍊欒繘琛屼簡浼樺寲錛屾煡鎵炬洿蹇紝鍦℅ridCast涓噰鐢ㄧ殑鏄疻SAEventSelect妯″瀷錛岀瓑寰呫?/p>


BTW錛氫笂闈㈡墍璇村潎鍦╓indows騫沖彴涓嬶紝鍙敤WinSock鎵嶆湁榪欎箞澶氭ā鍨嬶紝鍦╨inux涓嬶紝濂藉儚灝卞彧鏈夌涓縐峴elect妯″紡錛屾垜瀵筶inux涓嬬殑socket涓嶆槸寰堜簡瑙o紝搴旇涔熸湁寰堝鎻愰珮鏁堢巼鐨勫湴鏂廣?/p>

]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产导航| 亚洲二区视频| 久久成人综合视频| 香蕉免费一区二区三区在线观看| 国产精品视频久久一区| 久久黄金**| 久久综合给合| 一区二区高清在线| 亚洲欧美视频| 亚洲国产乱码最新视频| 一本大道av伊人久久综合| 国产欧美日韩精品a在线观看| 久久激情五月婷婷| 欧美国内亚洲| 欧美怡红院视频| 麻豆91精品91久久久的内涵| 在线亚洲国产精品网站| 亚洲综合色在线| 亚洲精品国产品国语在线app| 夜夜嗨av一区二区三区网页| 国产亚洲一级高清| 亚洲欧洲美洲综合色网| 国产有码在线一区二区视频| 亚洲高清资源综合久久精品| 国产精品嫩草久久久久| 欧美激情视频免费观看| 国产九九精品视频| 91久久久一线二线三线品牌| 国产视频精品免费播放| 亚洲另类在线一区| 欧美激情精品久久久久久大尺度| 久久精品国产96久久久香蕉| 一区二区三区四区五区精品视频| 欧美一区二区三区视频在线| 99re6这里只有精品| 久久超碰97中文字幕| 亚洲午夜免费视频| 美日韩精品免费| 久久久久欧美精品| 欧美色区777第一页| 欧美福利网址| 尤物九九久久国产精品的分类| 中文在线不卡| 亚洲婷婷免费| 欧美另类高清视频在线| 亚洲第一天堂av| 国语自产精品视频在线看抢先版结局| 99在线观看免费视频精品观看| 亚洲福利免费| 久久精品一区二区三区四区| 欧美在线影院| 国产欧美日韩综合一区在线播放| 9l国产精品久久久久麻豆| 亚洲激情校园春色| 久久综合久色欧美综合狠狠| 久久欧美中文字幕| 国产在线精品二区| 欧美一级视频一区二区| 欧美中文字幕视频| 国产人成一区二区三区影院| 一区二区免费看| 亚洲午夜91| 国产精品色一区二区三区| 夜夜嗨av一区二区三区网页| 在线视频亚洲欧美| 欧美性生交xxxxx久久久| 99视频+国产日韩欧美| 亚洲午夜免费福利视频| 国产精品国产三级国产普通话99 | 亚洲欧美精品中文字幕在线| 亚洲小说欧美另类社区| 国产精品国产福利国产秒拍| 亚洲少妇自拍| 久久精品国产2020观看福利| 国产主播精品在线| 美女脱光内衣内裤视频久久网站| 欧美激情影音先锋| 一区二区三区四区在线| 国产精品高清网站| 亚洲尤物精选| 美日韩精品视频| av72成人在线| 国产精品一区二区三区四区五区| 香蕉久久一区二区不卡无毒影院| 久久野战av| 一本色道久久88精品综合| 国产精品久久久久9999| 久久久一区二区三区| 亚洲欧洲精品成人久久奇米网| 亚洲永久精品大片| 激情综合色综合久久综合| 欧美久久久久久久| 欧美一级成年大片在线观看| 欧美激情第五页| 欧美伦理一区二区| 美女网站在线免费欧美精品| 亚洲精品一线二线三线无人区| 欧美三日本三级少妇三2023 | 欧美大片在线观看一区二区| 99在线观看免费视频精品观看| 国产精品资源| 欧美成人小视频| 欧美一级久久久久久久大片| 亚洲国产精品久久91精品| 午夜国产精品影院在线观看| 在线日韩中文字幕| 国产精品久久一区二区三区| 欧美成人激情视频免费观看| 亚洲影院一区| 亚洲精品在线观| 美女黄色成人网| 欧美在线观看一区| 日韩亚洲视频| 亚洲国语精品自产拍在线观看| 国产精品一区在线观看| 欧美日韩第一页| 狂野欧美一区| 久久黄色网页| 亚洲欧美中文字幕| 在线中文字幕日韩| 亚洲黄网站黄| 亚洲电影激情视频网站| 久久久亚洲高清| 性感少妇一区| 午夜精品福利电影| 亚洲尤物视频在线| 一区二区av在线| 日韩视频一区二区在线观看| 亚洲国产精品传媒在线观看 | 欧美激情第9页| 久热精品视频| 麻豆国产va免费精品高清在线| 欧美一区二区三区在线视频| 亚洲亚洲精品三区日韩精品在线视频 | 韩国精品一区二区三区| 国产精品久久国产三级国电话系列| 欧美综合二区| 欧美一区免费| 久久久精彩视频| 久久青草福利网站| 另类专区欧美制服同性| 美女国内精品自产拍在线播放| 久久久噜噜噜久噜久久| 久久免费观看视频| 免费观看欧美在线视频的网站| 你懂的网址国产 欧美| 欧美大片国产精品| 欧美日韩成人精品| 欧美午夜视频| 国产女主播一区| 激情小说另类小说亚洲欧美 | 国产精品日产欧美久久久久| 国产精品一二三视频| 国产午夜精品福利| 在线观看欧美日韩| 99视频一区二区三区| 亚洲综合电影| 久久久www成人免费无遮挡大片| 老司机精品视频网站| 亚洲高清毛片| 亚洲视频一区二区| 欧美资源在线观看| 欧美成人精品高清在线播放| 欧美午夜无遮挡| 韩日视频一区| 一区二区三区蜜桃网| 欧美中文在线字幕| 亚洲成人在线视频播放| 国产精品久久999| 国产欧美一区二区三区沐欲| 影音先锋一区| 在线视频精品一| 久久久国产精品一区| 亚洲成色999久久网站| 亚洲五月婷婷| 噜噜噜躁狠狠躁狠狠精品视频| 欧美精品日日鲁夜夜添| 国产伦精品一区二区三区照片91| 在线播放国产一区中文字幕剧情欧美 | 亚洲国产精品久久久久秋霞影院| 欧美国产大片| 亚洲天堂av在线免费观看| 久久久欧美精品| 国产精品国产馆在线真实露脸| 亚洲高清毛片| 欧美一级网站| 亚洲精品女人| 午夜日韩福利| 欧美日本高清视频| 亚洲电影自拍| 久久精品道一区二区三区| 亚洲精品网站在线播放gif| 久久国产手机看片| 国产精品一区二区三区乱码 | 国内一区二区在线视频观看| av成人毛片| 欧美激情第五页| 久久精品国产精品亚洲精品| 国产精品每日更新| 中文一区在线|