• <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>

            1.包含以下內(nèi)容
            #define WIN32_LEAN_AND_MEAN      //定義宏,不會(huì)出現(xiàn)error C2011: 'fd_set' : 'struct' type redefinition等錯(cuò)誤
            #define VC_EXTRALEAN

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

            2.定義結(jié)構(gòu)體

            typedef struct         
            {
             OVERLAPPED Overlapped;
             WSABUF DataBuf;
             CHAR Buffer[DATA_BUFSIZE];                    
             DWORD BytesSEND;                                 //發(fā)送字節(jié)數(shù)
             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);//調(diào)用Windows Sockets DLL
             if ((Ret = WSAStartup(0x0202, &wsaData)) != 0)
               {
                  printf("WSAStartup failed with error %d\n", Ret);
                  return;
               }
            4.申請(qǐng)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.一個(gè)例子

            //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;                                 
            //發(fā)送字節(jié)數(shù)
                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);//調(diào)用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();
                ///////////////////////////
                //取得系統(tǒng)中CPU的數(shù)目,創(chuàng)建和CPU數(shù)目相等的線(xiàn)程,如果事先估計(jì)到完成端口處理線(xiàn)程會(huì)堵塞,
                
            //可以考慮創(chuàng)建 SysInfo.dwNumberOfProcessors*2個(gè)線(xiàn)程。一般在單處理器上創(chuàng)建和CPU數(shù)目相等
                
            //的線(xiàn)程就可以了
                
            //獲得CPU個(gè)數(shù)
                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;
                    
            //
                    
            //清管子的數(shù)據(jù)結(jié)構(gòu),準(zhǔn)備往里面灌數(shù)據(jù)
                    
            //
                    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接到了數(shù)據(jù),就放到PerIoData中,而perIoData又通過(guò)線(xiàn)程中的函數(shù)取出,
                    
            //
                    
                    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發(fā)過(guò)來(lái)一個(gè)空的單句柄數(shù)據(jù),表示線(xiàn)程要退出了。"<<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);//調(diào)用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 艾凡赫 閱讀(826) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): NET WORK

            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久亚洲国产中v天仙www| 久久精品无码一区二区日韩AV | 99久久综合狠狠综合久久止| 中文无码久久精品| 青青久久精品国产免费看| 一本大道久久东京热无码AV| 四虎国产精品免费久久| 一本一道久久综合狠狠老| 精品久久无码中文字幕| 久久激情五月丁香伊人| 亚洲乱码精品久久久久..| 好久久免费视频高清| 欧美伊人久久大香线蕉综合69| 亚洲中文久久精品无码| 国产成人久久精品麻豆一区| 777午夜精品久久av蜜臀| 狠狠久久综合| 人人狠狠综合久久亚洲88| 欧美日韩精品久久久久| 色婷婷综合久久久久中文字幕| 亚洲愉拍99热成人精品热久久 | 久久av免费天堂小草播放| 国产精品久久精品| 日本欧美久久久久免费播放网| 久久亚洲视频| 四虎影视久久久免费| 久久亚洲高清综合| 亚洲人成电影网站久久| 色综合久久88色综合天天 | 亚洲精品无码专区久久同性男 | 狠狠综合久久AV一区二区三区| 亚洲国产成人精品91久久久 | 99国内精品久久久久久久| 久久91这里精品国产2020| 香蕉99久久国产综合精品宅男自| 精品久久人人做人人爽综合| 久久婷婷五月综合色99啪ak| 久久久久波多野结衣高潮| 狠狠狠色丁香婷婷综合久久五月| 91精品国产91久久久久久青草| 久久最新免费视频|