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

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>
            国产欧美日韩另类视频免费观看| 久久久久久夜| 免费成人性网站| 久久久久久久久久久久久女国产乱| 黄色成人av在线| 亚洲国产精品一区二区尤物区| 久久精品盗摄| 亚洲精品免费看| 一本色道久久综合亚洲精品高清| 国产日韩一级二级三级| 亚洲大胆女人| 欧美性大战久久久久久久蜜臀| 久久国产一区二区| 欧美韩国一区| 久久精品日产第一区二区| 欧美激情网友自拍| 久久国产色av| 欧美精品亚洲一区二区在线播放| 欧美一区激情| 欧美日本三级| 欧美成黄导航| 国产美女精品免费电影| 91久久久久久| 精品69视频一区二区三区| 在线视频精品| 日韩一区二区精品视频| 久久精品亚洲精品| 性做久久久久久| 欧美日韩精品欧美日韩精品一| 美女精品国产| 国产一区二区精品| 中国女人久久久| 亚洲理论电影网| 久久久999精品免费| 性久久久久久久久| 欧美午夜视频| 亚洲人成毛片在线播放| 亚洲国产欧美另类丝袜| 欧美在线免费观看| 欧美有码视频| 国产精品久久二区二区| 亚洲美女黄色片| 亚洲精品午夜| 快播亚洲色图| 欧美aⅴ99久久黑人专区| 国产欧美日韩精品一区| 亚洲一二三区精品| 亚洲综合首页| 欧美偷拍另类| 洋洋av久久久久久久一区| 亚洲精品社区| 欧美黄色成人网| 亚洲国内高清视频| 亚洲乱码国产乱码精品精 | 国产麻豆精品theporn| 妖精视频成人观看www| 这里只有视频精品| 欧美日韩精品一区二区在线播放| 亚洲激情影院| 99精品国产一区二区青青牛奶 | 久久电影一区| 国产色产综合色产在线视频| 午夜精品一区二区三区四区 | 欧美性一区二区| 国产精品99久久久久久久久| 亚洲欧美不卡| 国产日韩欧美不卡| 欧美一区二区三区视频在线 | 欧美午夜无遮挡| 亚洲综合另类| 久久婷婷综合激情| 亚洲国产美女精品久久久久∴| 欧美搞黄网站| 一区二区电影免费在线观看| 欧美一级久久久| 国产在线精品自拍| 久热精品视频在线| 亚洲美女毛片| 欧美一级大片在线免费观看| 国产在线成人| 欧美电影免费观看大全| 这里只有精品视频| 久久字幕精品一区| 9久re热视频在线精品| 国产精品区一区二区三| 久久精品二区三区| 99re66热这里只有精品4| 欧美一区二区三区在| 亚洲电影在线播放| 欧美日韩性视频在线| 篠田优中文在线播放第一区| 亚洲第一福利在线观看| 午夜久久tv| 亚洲国产成人av| 国产精品九九久久久久久久| 久久手机精品视频| 中文在线资源观看网站视频免费不卡| 久久精品盗摄| 99re6热只有精品免费观看 | 亚洲精品乱码久久久久久| 欧美一区二区女人| 亚洲激情不卡| 国产日韩一区| 欧美日韩免费高清| 久久久久国色av免费看影院 | 亚洲伦理在线免费看| 国产亚洲精品v| 欧美日韩一区二区三区免费| 久久久久久69| 亚洲欧美精品中文字幕在线| 亚洲国产精品欧美一二99| 久久国产欧美精品| 亚洲一区三区视频在线观看| 亚洲激情专区| 影音先锋亚洲精品| 国产麻豆精品theporn| 欧美午夜不卡在线观看免费| 毛片精品免费在线观看| 久久福利精品| 欧美一区视频在线| 亚洲视频福利| 99国内精品久久| 亚洲国产婷婷香蕉久久久久久| 老牛嫩草一区二区三区日本| 亚洲欧美日韩中文播放| 一本色道久久88综合亚洲精品ⅰ| 亚洲福利专区| 激情欧美一区二区三区| 国产午夜一区二区三区| 国产精品三级视频| 国产精品盗摄久久久| 欧美日韩视频免费播放| 欧美激情综合网| 欧美成人自拍| 欧美国产日韩一区二区在线观看| 久久综合久色欧美综合狠狠| 久久久久久噜噜噜久久久精品| 欧美在线观看天堂一区二区三区| 午夜精品亚洲一区二区三区嫩草| 亚洲欧美成人在线| 亚洲欧美日韩国产成人精品影院| 亚洲一区二区三区精品视频 | 亚洲人成久久| 最新亚洲激情| 日韩视频不卡| 一区二区三区日韩| 亚洲一区二区伦理| 午夜精品福利电影| 久久国产日韩欧美| 蜜桃av一区二区三区| 欧美激情欧美狂野欧美精品| 亚洲福利av| 亚洲精品欧美一区二区三区| 亚洲欧洲一区二区三区| 亚洲精品你懂的| 91久久精品国产91久久性色tv| 最新国产の精品合集bt伙计| 亚洲乱码久久| 亚洲综合成人婷婷小说| 久久本道综合色狠狠五月| 久久精品国产精品亚洲综合 | 久久久免费精品视频| 男女精品视频| 亚洲精品一区二区三区福利| 亚洲少妇一区| 久久精品国产99| 欧美精品 日韩| 国产美女精品人人做人人爽| 在线欧美小视频| 亚洲精品专区| 欧美影院在线播放| 免费日本视频一区| 99精品99久久久久久宅男| 西西人体一区二区| 欧美ed2k| 国产美女精品免费电影| 亚洲国产精品免费| 亚洲欧美大片| 免费在线视频一区| 一本色道婷婷久久欧美| 久久久www成人免费毛片麻豆| 欧美精品v日韩精品v国产精品| 国产欧美精品一区二区三区介绍| 极品尤物一区二区三区| 亚洲丝袜av一区| 麻豆精品传媒视频| 夜夜嗨av色综合久久久综合网| 久久gogo国模裸体人体| 欧美日韩国产成人在线| 韩国av一区二区三区四区| 在线视频精品一区| 免费观看日韩| 亚洲欧美网站| 欧美人交a欧美精品| 国内外成人免费激情在线视频网站| 一本色道久久综合亚洲精品按摩| 久久久久一区二区三区四区| 一区二区三区国产| 欧美多人爱爱视频网站| 狠狠色丁香婷婷综合影院|