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

               C++ 技術(shù)中心

               :: 首頁 :: 聯(lián)系 ::  :: 管理
              160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

            公告

            鄭重聲明:本BLOG所發(fā)表的原創(chuàng)文章,作者保留一切權(quán)利。必須經(jīng)過作者本人同意后方可轉(zhuǎn)載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

            留言簿(27)

            搜索

            •  

            最新隨筆

            最新評論

            評論排行榜

            1. 服務(wù)器端代碼:


            #include 
            "stdafx.h"

            #include 
            <WINSOCK2.H>
            #include 
            <stdio.h>

            #define PORT    5150
            #define MSGSIZE 1024

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

            typedef 
            enum
            {
                RECV_POSTED
            }
            OPERATION_TYPE;

            typedef 
            struct
            {
                WSAOVERLAPPED  overlap;
                WSABUF         Buffer;
                
            char           szMessage[MSGSIZE];
                DWORD          NumberOfBytesRecvd;
                DWORD          Flags;
                OPERATION_TYPE OperationType;
            }
            PER_IO_OPERATION_DATA, *LPPER_IO_OPERATION_DATA;

            DWORD WINAPI WorkerThread(LPVOID);

            int main()
            {
                WSADATA                 wsaData;
                SOCKET                  sListen, sClient;
                SOCKADDR_IN             local, client;
                DWORD                   i, dwThreadId;
                
            int                     iaddrSize = sizeof(SOCKADDR_IN);
                HANDLE                  CompletionPort 
            = INVALID_HANDLE_VALUE;
                SYSTEM_INFO             systeminfo;
                LPPER_IO_OPERATION_DATA lpPerIOData 
            = NULL;

                
            // Initialize Windows Socket library
                WSAStartup(0x0202&wsaData);

                
            // Create completion port
                CompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 00);

                
            // Create worker thread
                GetSystemInfo(&systeminfo);
                
            for (i = 0; i < systeminfo.dwNumberOfProcessors; i++)
                
            {
                    CreateThread(NULL, 
            0, WorkerThread, CompletionPort, 0&dwThreadId);
                }


                
            // Create listening socket
                sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

                
            // Bind
                local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
                local.sin_family 
            = AF_INET;
                local.sin_port 
            = htons(PORT);
                bind(sListen, (
            struct sockaddr *)&local, sizeof(SOCKADDR_IN));

                
            // Listen
                listen(sListen, 3);

                
            while (TRUE)
                
            {
                    
            // Accept a connection
                    sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize);
                    printf(
            "Accepted client:%s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));

                    
            // Associate the newly arrived client socket with completion port
                    CreateIoCompletionPort((HANDLE)sClient, CompletionPort, (DWORD)sClient, 0);

                    
            // Launch an asynchronous operation for new arrived connection
                    lpPerIOData = (LPPER_IO_OPERATION_DATA)HeapAlloc(
                        GetProcessHeap(),
                        HEAP_ZERO_MEMORY,
                        
            sizeof(PER_IO_OPERATION_DATA));
                    lpPerIOData
            ->Buffer.len = MSGSIZE;
                    lpPerIOData
            ->Buffer.buf = lpPerIOData->szMessage;
                    lpPerIOData
            ->OperationType = RECV_POSTED;
                    WSARecv(sClient,
                        
            &lpPerIOData->Buffer,
                        
            1,
                        
            &lpPerIOData->NumberOfBytesRecvd,
                        
            &lpPerIOData->Flags,
                        
            &lpPerIOData->overlap,
                        NULL);
                }


                PostQueuedCompletionStatus(CompletionPort, 
            0xFFFFFFFF0, NULL);
                CloseHandle(CompletionPort);
                closesocket(sListen);
                WSACleanup();
                
            return 0;
            }


            DWORD WINAPI WorkerThread(LPVOID CompletionPortID)
            {
                HANDLE                  CompletionPort
            =(HANDLE)CompletionPortID;
                DWORD                   dwBytesTransferred;
                SOCKET                  sClient;
                LPPER_IO_OPERATION_DATA lpPerIOData 
            = NULL;

                
            while (TRUE)
                
            {
                    GetQueuedCompletionStatus(
                        CompletionPort,
                        
            &dwBytesTransferred,
                        (PULONG_PTR)
            &sClient,
                        (LPOVERLAPPED 
            *)&lpPerIOData,
                        INFINITE);
                    
            if (dwBytesTransferred == 0xFFFFFFFF)
                    
            {
                        
            return 0;
                    }


                    
            if (lpPerIOData->OperationType == RECV_POSTED)
                    
            {
                        
            if (dwBytesTransferred == 0)
                        
            {
                            
            // Connection was closed by client
                            closesocket(sClient);
                            HeapFree(GetProcessHeap(), 
            0, lpPerIOData);        
                        }

                        
            else
                        
            {
                            lpPerIOData
            ->szMessage[dwBytesTransferred] = '\0';
                            send(sClient, lpPerIOData
            ->szMessage, dwBytesTransferred, 0);

                            
            // Launch another asynchronous operation for sClient
                            memset(lpPerIOData, 0sizeof(PER_IO_OPERATION_DATA));
                            lpPerIOData
            ->Buffer.len = MSGSIZE;
                            lpPerIOData
            ->Buffer.buf = lpPerIOData->szMessage;
                            lpPerIOData
            ->OperationType = RECV_POSTED;
                            WSARecv(sClient,
                                
            &lpPerIOData->Buffer,
                                
            1,
                                
            &lpPerIOData->NumberOfBytesRecvd,
                                
            &lpPerIOData->Flags,
                                
            &lpPerIOData->overlap,
                                NULL);
                        }

                    }

                }

                
            return 0;
            }



            2. 客戶端代碼片斷:
            void CTestClientDlg::OnBnClickedOk()
            {
                
            // TODO: 在此添加控件通知處理程序代碼
                
            //CDialogEx::OnOK();

                UpdateData(TRUE);

                
            byte b1,b2,b3,b4;
                
            char strIpAddress[20]={0};
                m_IpCtrl.GetAddress(b1,b2,b3,b4);
                sprintf(strIpAddress,
            "%d.%d.%d.%d",b1,b2,b3,b4);
                
                TCHAR buffer[
            1024];
                sprintf(buffer,_T(
            "%d"),m_port);

                SOCKET sockClient
            =socket(AF_INET,SOCK_STREAM,0);
                SOCKADDR_IN addrSrv;
                addrSrv.sin_addr.S_un.S_addr
            =inet_addr(strIpAddress);
                addrSrv.sin_family
            =AF_INET;
                addrSrv.sin_port
            =htons((UINT)m_port);

                
            //向服務(wù)器發(fā)出連接請求
                connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));


                
            char recvBuf[100];
                
            //接收數(shù)據(jù)

                send(sockClient,
            "This is lisi",strlen("This is lisi")+1,0);

                recv(sockClient,recvBuf,
            100,0);
                printf(
            "%s\n",recvBuf);

                
            //關(guān)閉套接字
                closesocket(sockClient);
            }
                
            posted on 2011-03-01 11:45 C++技術(shù)中心 閱讀(2927) 評論(2)  編輯 收藏 引用 所屬分類: Windows 網(wǎng)絡(luò)編程

            Feedback

            # re: 完成端口示例 2011-03-01 22:56 liquanhai
            想問問樓主的程序是怎么試的,我弄了一下沒有成功,想請教一下?
              回復(fù)  更多評論
              

            # re: 完成端口示例 2011-03-02 09:01 C++技術(shù)中心
            @liquanhai
            復(fù)制到VC里就行了.已經(jīng)在VC2010中編譯通過,復(fù)制到blog上來的.
            客戶端是代碼片段,需要自已調(diào)整一下代碼.  回復(fù)  更多評論
              

            一日本道伊人久久综合影| 久久精品国产影库免费看 | 久久精品国产精品亚洲下载| 午夜天堂av天堂久久久| 大香伊人久久精品一区二区| 久久午夜综合久久| 亚州日韩精品专区久久久| 久久这里有精品视频| 色诱久久av| 亚洲va久久久噜噜噜久久| 日韩精品久久久久久免费| 久久精品国产亚洲AV忘忧草18| 欧美性猛交xxxx免费看久久久| 亚洲精品成人网久久久久久| 7777精品伊人久久久大香线蕉 | 精品九九久久国内精品| 久久国产精品-国产精品| 色综合色天天久久婷婷基地| 国产高清美女一级a毛片久久w | 色综合久久综合网观看| 国产精品一区二区久久精品无码 | 久久久久一区二区三区| 久久国产热这里只有精品| 婷婷国产天堂久久综合五月| 青草国产精品久久久久久| 久久国产成人精品麻豆| 亚洲&#228;v永久无码精品天堂久久 | 久久精品国产99国产电影网| 久久久久久噜噜精品免费直播| 欧美黑人激情性久久| 久久久久久夜精品精品免费啦 | 久久久老熟女一区二区三区| 国产人久久人人人人爽| 国产午夜精品理论片久久| 久久久久人妻一区精品性色av| 国产午夜电影久久| 日日躁夜夜躁狠狠久久AV| 久久久久久无码国产精品中文字幕| 麻豆成人久久精品二区三区免费| 94久久国产乱子伦精品免费| 国产亚洲精品久久久久秋霞|