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

1.包含以下內容
#define WIN32_LEAN_AND_MEAN      //定義宏,不會出現error C2011: 'fd_set' : 'struct' type redefinition等錯誤
#define VC_EXTRALEAN

#include <windows.h>
#include <winsock2.h>
#include "iostream"
#pragma comment(lib, "Ws2_32.lib")

2.定義結構體

typedef struct         
{
 OVERLAPPED Overlapped;
 WSABUF DataBuf;
 CHAR Buffer[DATA_BUFSIZE];                    
 DWORD BytesSEND;                                 //發送字節數
 DWORD BytesRECV;                                
} PER_IO_OPERATION_DATA, * LPPER_IO_OPERATION_DATA;


typedef struct
{
 SOCKET Socket;
} PER_HANDLE_DATA, * LPPER_HANDLE_DATA;

3.初始化socket

WORD wVersionRequested;
 WSADATA wsaData;
 int Ret;
 
 wVersionRequested = MAKEWORD(2,0);
 //err = WSAStartup(wVersionRequested, &wsaData);//調用Windows Sockets DLL
 if ((Ret = WSAStartup(0x0202, &wsaData)) != 0)
   {
      printf("WSAStartup failed with error %d\n", Ret);
      return;
   }
4.申請PER_IO_DATA
//使用NEW不可以。
//PerHandleData = new PER_HANDLE_DATA;
  if ((PerHandleData = (LPPER_HANDLE_DATA) GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA))) == NULL)
  {
   printf("GlobalAlloc() failed with error %d\n", GetLastError());
   return;
  }     

5.一個例子

//server.cpp
#include <winsock2.h>
#include 
<windows.h>
#include 
"socketapi.h"
#include 
"socketnotify.h"
#include 
"iostream"

using namespace std;
#pragma comment(lib, 
"Ws2_32")

#define OP_READ     0
#define OP_WRITE    1
#define OP_ACCEPT   2
#define DATA_BUFSIZE 1024



typedef 
struct
{
    OVERLAPPED Overlapped;
    WSABUF DataBuf;
    CHAR Buffer[DATA_BUFSIZE];                     
    DWORD BytesSEND;                                 
//發送字節數
    DWORD BytesRECV;                                 
}
 PER_IO_OPERATION_DATA, * LPPER_IO_OPERATION_DATA;


typedef 
struct
{
    SOCKET Socket;
}
 PER_HANDLE_DATA, * LPPER_HANDLE_DATA;

 
DWORD __stdcall CompletionRoutine(LPVOID Param);
int main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    
int Ret;
    
    wVersionRequested 
= MAKEWORD(2,0);
    
//err = WSAStartup(wVersionRequested, &wsaData);//調用Windows Sockets DLL
    if ((Ret = WSAStartup(0x0202&wsaData)) != 0)
   
{
      printf(
"WSAStartup failed with error %d\n", Ret);
      
return;
   }
 
    HANDLE    CompletionPort;
    LPPER_HANDLE_DATA PerHandleData ;
    LPPER_IO_OPERATION_DATA     PerIoData ;
    SOCKADDR_IN InternetAddr;
    DWORD RecvBytes;
    DWORD Flags;
    SOCKET server;
    SOCKET Accept;
    
if ((server = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0,
        WSA_FLAG_OVERLAPPED)) 
== INVALID_SOCKET)
    
{
        printf(
"WSASocket() failed with error %d\n", WSAGetLastError());
        
return;
    }

    InternetAddr.sin_family 
= AF_INET;
    InternetAddr.sin_addr.s_addr 
= htonl(INADDR_ANY);
    InternetAddr.sin_port 
= htons(8000);
    
if (bind(server, (PSOCKADDR) &InternetAddr, sizeof(InternetAddr)) == SOCKET_ERROR)
    
{
        printf(
"bind() failed with error %d\n", WSAGetLastError());
        WSACleanup();
        
return;
    }
   
    
    
if (listen(server, 5== SOCKET_ERROR)
    
{
        printf(
"listen() failed with error %d\n", WSAGetLastError());
        WSACleanup();
        
return;
    }

    
//    server.set_port(8000);
    
//    server.listen();
    ///////////////////////////
    //取得系統中CPU的數目,創建和CPU數目相等的線程,如果事先估計到完成端口處理線程會堵塞,
    
//可以考慮創建 SysInfo.dwNumberOfProcessors*2個線程。一般在單處理器上創建和CPU數目相等
    
//的線程就可以了
    
//獲得CPU個數
    SYSTEM_INFO sysInfo;    
    ZeroMemory(
&sysInfo,sizeof(SYSTEM_INFO));
    ZeroMemory(
&wsaData,sizeof(WSADATA));    
    GetSystemInfo(
&sysInfo);    
    
int nNumberOfConcurrent = sysInfo.dwNumberOfProcessors * 2+2;    
    
    CompletionPort 
= CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, nNumberOfConcurrent);
    
if (NULL == CompletionPort)
    
{
        cout 
<< "CreateIoCompletionPort() failed: " << GetLastError() << endl;
        
        
return ;
    }

    
    PER_IO_OPERATION_DATA per_io_data;
    
    cout
<<"port:"<<CompletionPort<<endl;
    HANDLE     m_hThreadArray[
8];
    
for (int i=0; i<1; i++)
    
{
        m_hThreadArray[i] 
= CreateThread(NULL, 0, CompletionRoutine, (LPVOID)CompletionPort, 0, NULL);
        
if (NULL == m_hThreadArray[i])
        
{
            
while (i>0)
            
{
                CloseHandle(m_hThreadArray[i
-1]);
                m_hThreadArray[i
-1= INVALID_HANDLE_VALUE;
                i
--;
            }
//end of while
            
            cout 
<< "CreateThread() failed: " << GetLastError() << endl;
            CloseHandle(CompletionPort);
            
            
            
return  ;
        }

    }
//end of for
    
    Sleep(
1000);
    
while(1)
    
{
        cout
<<"waiting for accept "<<endl;
        
//int sClient = server.accept();
        
        
if ((Accept = WSAAccept(server, NULL, NULL, NULL, 0)) == SOCKET_ERROR)
        
{
            printf(
"WSAAccept() failed with error %d\n", WSAGetLastError());
            
return;
        }

        
        cout
<<"accetp :"<<Accept<<endl;
        
        
//PerHandleData = new PER_HANDLE_DATA;
        if ((PerHandleData = (LPPER_HANDLE_DATA) GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA))) == NULL)
        
{
            printf(
"GlobalAlloc() failed with error %d\n", GetLastError());
            
return;
        }
      
        PerHandleData
->Socket = Accept;
        
if(CreateIoCompletionPort((HANDLE)Accept, CompletionPort, (DWORD)PerHandleData, 0== NULL)
        
{
            printf(
"CreateIoCompletionPort failed with error %d\n", GetLastError());
            
return ;
            
        }

        
//PerIoData  = new PER_IO_OPERATION_DATA;
        
//
        
//清管子的數據結構,準備往里面灌數據
        
//
        if ((PerIoData = (LPPER_IO_OPERATION_DATA) GlobalAlloc(GPTR,sizeof(PER_IO_OPERATION_DATA))) == NULL)
        
{
            printf(
"GlobalAlloc() failed with error %d\n", GetLastError());
            
return;
        }

        memset(
&(PerIoData->Overlapped), sizeof(OVERLAPPED),0);
        PerIoData
->BytesSEND = 0;
        PerIoData
->BytesRECV = 0;
        PerIoData
->DataBuf.len = DATA_BUFSIZE;
        PerIoData
->DataBuf.buf = PerIoData->Buffer;
        
        
//
        
//  accept接到了數據,就放到PerIoData中,而perIoData又通過線程中的函數取出,
        
//
        
        RecvBytes 
= 0;
        Flags 
= 0;
        
if (WSARecv(Accept, &(PerIoData->DataBuf), 1&RecvBytes, &Flags,
            
&(PerIoData->Overlapped), NULL) == SOCKET_ERROR)
        
{
            
if (WSAGetLastError() != ERROR_IO_PENDING)
            
{
                printf(
"main WSARecv() failed with error %d\n", WSAGetLastError());
                WSACleanup();
                
return;
            }

        }

        
//cout<<"recv :"<<PerIoData->Buffer<<endl;
        
        
        
    }

    PostQueuedCompletionStatus(CompletionPort, 
0xFFFFFFFF0, NULL);
    CloseHandle(CompletionPort);
    
    WSACleanup();
 
    cin
>>i;
    
return ;
}


DWORD __stdcall CompletionRoutine(LPVOID Param)
{
    
    HANDLE CompletionPort 
= (HANDLE) Param;
    
    PER_IO_OPERATION_DATA 
*pData = (PER_IO_OPERATION_DATA*)Param;
    
    DWORD BytesTransferred;
    LPOVERLAPPED Overlapped;
    LPPER_HANDLE_DATA PerHandleData;
    LPPER_IO_OPERATION_DATA PerIoData;         
    DWORD SendBytes, RecvBytes;
    DWORD Flags;
    
    
    
    
while(1)
    
{

        
int bSuccess = GetQueuedCompletionStatus(
            CompletionPort,
            
&BytesTransferred,
            (LPDWORD)
&PerHandleData,
            (LPOVERLAPPED 
*&PerIoData,
            INFINITE
            );
        
        cout
<<"----------------------------"<<endl;
        
        
if (0 == bSuccess)
        
{
            
if (WSARecv(PerHandleData->Socket, &(PerIoData->DataBuf), 1&RecvBytes, &Flags,
            
&(PerIoData->Overlapped), NULL) == SOCKET_ERROR)
            
{
                
int iError = WSAGetLastError();
                
if ( iError!= ERROR_IO_PENDING)
                
{
                    printf(
"client %d closed \n", PerHandleData->Socket);
                    closesocket(PerHandleData
->Socket);
                }

            }

            
            
continue;
        }

        
if (NULL == PerIoData)
        
{
            
//
            cout<<"//PostQueuedCompletionStatus發過來一個空的單句柄數據,表示線程要退出了。"<<endl;
            
//
            return 0;
        }

        Flags 
= 0;
        
if (WSARecv(PerHandleData->Socket, &(PerIoData->DataBuf), 1&RecvBytes, &Flags,
            
&(PerIoData->Overlapped), NULL) == SOCKET_ERROR)
        
{
            
if (WSAGetLastError() != ERROR_IO_PENDING)
            
{
                printf(
"thread WSARecv() failed with error %d\n", WSAGetLastError());
                
return 0;
            }

        }

        
        cout
<<"recv from "<<PerHandleData->Socket<<":"<<PerIoData->Buffer<<endl;
        
        
    }

    
    
return 0;
}


 
#include 
"iostream"

#include 
<winsock2.h>
#include 
<windows.h>
using namespace std;
#pragma comment(lib, 
"Ws2_32")

 
int main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    
int err;
    wVersionRequested 
= MAKEWORD(2,0);
    err 
= WSAStartup(wVersionRequested, &wsaData);//調用Windows Sockets DLL
    if(err != 0)
    
{
         cout
<<"socket init error."<< endl;
    }

    
int i=0;
    
int iRet = 0;
    SOCKET client;

    client 
= socket( AF_INET, SOCK_STREAM, 0); 
    
if( client == INVALID_SOCKET )
    
{
        cout
<< "socket() error"<<WSAGetLastError() <<endl;
    }

    SOCKADDR_IN        saServer;        

    memset(
&saServer,0,sizeof(saServer));

    saServer.sin_family 
= AF_INET;
    saServer.sin_addr.s_addr 
= inet_addr("127.0.0.1");
    saServer.sin_port 
= htons(8000);
    
int nRet = connect(client,(sockaddr*)&saServer, sizeof(saServer));
    
if( iRet == SOCKET_ERROR)
    
{
        cout
<<"connect error"<<endl;
        
return 0;
    }

    
else
    
{
        cout
<<"iRet:"<<iRet<<endl;
        cout
<<"connect success"<<WSAGetLastError()<<endl;
    }

     
char buffer[128]={0};
     
while(1)
     
{
         memset(buffer,
0,128);
         cout
<<"input to send:";
         cin
>>buffer;
         
if(buffer[0== 'q')
            
break;
        
int nBytes;

        
if ((nBytes = send(client, buffer, strlen(buffer),0))
            
== SOCKET_ERROR)
        
{
            
if (GetLastError() == WSAEWOULDBLOCK) 
            
{
                printf(
"Blocking\n");
                Sleep(
100);
                
break;
            }

            
else
            
{
                cout
<<"send error:"<<GetLastError()<<endl;
                closesocket(client);
                
break;
            }

        }

        cout
<<"send success .."<<endl;
     }

     WSACleanup();
    
return 0;
}


Posted on 2008-09-28 13:54 艾凡赫 閱讀(840) 評論(0)  編輯 收藏 引用 所屬分類: NET WORK

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲黄色免费| 91久久精品国产91久久| 99热精品在线观看| 欧美性片在线观看| 久久国产精品毛片| 久久男女视频| 99精品欧美一区二区三区综合在线| 亚洲欧洲一区二区天堂久久 | 在线亚洲欧美视频| 午夜国产一区| 亚洲精品亚洲人成人网| 午夜视频在线观看一区| 日韩视频免费大全中文字幕| 欧美亚洲综合另类| 一区二区三区高清不卡| 狼狼综合久久久久综合网| 午夜精品视频在线观看一区二区 | 久久精品国产免费看久久精品| 欧美风情在线| 久久九九久精品国产免费直播| 欧美成人精品在线观看| 久久精品论坛| 欧美午夜一区二区| 亚洲福利一区| 一区二区视频免费完整版观看| 亚洲视屏在线播放| 在线亚洲伦理| 欧美人与性禽动交情品| 欧美激情一区二区三区全黄| 国产视频不卡| 亚洲在线中文字幕| 亚洲一区在线观看免费观看电影高清| 免费一级欧美片在线播放| 久久夜色精品| 国产在线拍揄自揄视频不卡99| 亚洲午夜av在线| 亚洲午夜一二三区视频| 欧美激情视频给我| 欧美激情一二三区| 亚洲经典一区| 欧美成人在线免费视频| 欧美成人高清| 亚洲高清久久久| 久色成人在线| 欧美成人免费全部| 亚洲成人在线观看视频| 久久先锋影音av| 开心色5月久久精品| 国语自产精品视频在线看抢先版结局| 亚洲伊人网站| 久久久999精品视频| 狠狠色综合播放一区二区| 久久久精品免费视频| 久久综合综合久久综合| 激情婷婷欧美| 免费亚洲电影在线观看| 亚洲欧洲综合另类在线| 一区二区三区回区在观看免费视频| 欧美日本在线播放| 中文欧美在线视频| 国产亚洲精品资源在线26u| 久久一日本道色综合久久| 国产夜色精品一区二区av| 亚洲中字在线| 久久久久久久一区| 国内精品写真在线观看| 久久―日本道色综合久久| 欧美大片一区二区| 一二三区精品| 国产精品稀缺呦系列在线| 欧美在线观看一区二区| 欧美电影资源| 亚洲图片自拍偷拍| 国产日韩av高清| 久久综合激情| 一本色道久久99精品综合 | 欧美v国产在线一区二区三区| 亚洲黄色在线看| 亚洲欧美另类中文字幕| 国产丝袜一区二区三区| 久久久水蜜桃| 99热精品在线观看| 米奇777超碰欧美日韩亚洲| 一本不卡影院| 国模叶桐国产精品一区| 欧美国产精品人人做人人爱| 一区二区三区免费观看| 裸体素人女欧美日韩| 日韩亚洲欧美成人一区| 国产精品青草综合久久久久99| 久久国产精彩视频| 亚洲美女免费视频| 久久久欧美精品sm网站| 亚洲精品网站在线播放gif| 国产精品亚洲第一区在线暖暖韩国| 久久精品国产96久久久香蕉| 99国产精品久久久久老师| 另类av导航| 午夜一区二区三视频在线观看 | 久久久久久久高潮| av成人激情| 欧美黑人在线观看| 欧美自拍丝袜亚洲| 亚洲午夜精品久久| 亚洲激情女人| 黄色在线成人| 国产精品入口夜色视频大尺度 | 欧美成人精品在线观看| 性色av香蕉一区二区| 99精品视频免费观看| 国语精品中文字幕| 国产精品亚洲综合天堂夜夜| 欧美美女视频| 美国十次成人| 久久九九热re6这里有精品| 亚洲欧美999| 99国产一区二区三精品乱码| 亚洲第一成人在线| 蜜桃久久av一区| 久久久亚洲人| 久久国产精品久久久| 亚洲欧美一区二区精品久久久| 日韩小视频在线观看专区| 亚洲激情第一页| 亚洲肉体裸体xxxx137| 亚洲高清不卡一区| 亚洲国产天堂网精品网站| 1024亚洲| 在线观看欧美视频| 欧美/亚洲一区| 久久综合久久综合久久| 久久精品国产第一区二区三区| 午夜精品久久久久久久久| 亚洲欧美成aⅴ人在线观看| 亚洲主播在线观看| 午夜久久久久| 欧美一区二区视频在线观看| 性亚洲最疯狂xxxx高清| 欧美一级网站| 欧美一区二区观看视频| 欧美亚洲午夜视频在线观看| 性18欧美另类| 欧美在线日韩在线| 欧美一区二区久久久| 欧美亚洲日本国产| 久久久精品999| 欧美mv日韩mv国产网站| 欧美电影在线观看| 欧美国产日韩一二三区| 欧美精品一区二区三区在线播放| 欧美极品影院| 欧美揉bbbbb揉bbbbb| 欧美午夜精品伦理| 国产精品无人区| 国产主播喷水一区二区| 亚洲国产第一页| 亚洲片在线观看| 日韩一区二区免费高清| 亚洲一区二区三区777| 欧美一区高清| 蜜桃av噜噜一区二区三区| 亚洲精品视频二区| 亚洲免费在线播放| 久久人人97超碰精品888| 欧美mv日韩mv国产网站| 国产精品国产三级国产专播精品人 | 在线看日韩欧美| 亚洲三级观看| 亚洲综合精品一区二区| 久久精品国产清高在天天线| 欧美成人在线免费观看| 一区二区三区回区在观看免费视频| 亚洲免费在线看| 麻豆精品国产91久久久久久| 欧美日韩国产大片| 国产一区91| 洋洋av久久久久久久一区| 久久国产精品一区二区三区| 亚洲高清在线观看| 亚洲中午字幕| 欧美伦理在线观看| 怡红院精品视频| 午夜精品久久久久影视| 亚洲电影第三页| 午夜日本精品| 欧美日韩国产美女| 狠狠色综合日日| 欧美亚洲综合网| 最新国产乱人伦偷精品免费网站| 亚洲午夜日本在线观看| 欧美a级理论片| 国产亚洲精品久久久久动| 99精品视频免费| 欧美国产精品久久| 午夜视频一区二区| 国产精品videosex极品| 亚洲人体影院| 久久一区国产| 欧美一区二区三区免费视频| 国产精品红桃|