• <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++ 技術中心

               :: 首頁 :: 聯系 ::  :: 管理
              160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

            公告

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

            留言簿(27)

            搜索

            •  

            最新隨筆

            最新評論

            評論排行榜

            1. 服務器端代碼:


            #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);

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


                
            char recvBuf[100];
                
            //接收數據

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

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

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

            Feedback

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

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

            亚洲国产香蕉人人爽成AV片久久| 综合人妻久久一区二区精品| 久久久综合九色合综国产| 色88久久久久高潮综合影院 | 久久人人爽人人爽人人片AV高清| 精品国产日韩久久亚洲| 国产一区二区三区久久| 人妻无码久久精品| 国产99精品久久| 中文字幕久久精品| 免费国产99久久久香蕉| 一级做a爰片久久毛片看看| 精品蜜臀久久久久99网站| 国产精品99久久久久久猫咪| 午夜人妻久久久久久久久| 久久激情亚洲精品无码?V| 久久综合给合久久国产免费| 亚洲欧美日韩久久精品| 色综合久久精品中文字幕首页| 日日躁夜夜躁狠狠久久AV| 亚洲国产精品狼友中文久久久| 久久精品国产亚洲麻豆| 乱亲女H秽乱长久久久| 亚洲精品无码久久不卡| 久久精品无码一区二区三区日韩| 久久99精品国产99久久| 欧美丰满熟妇BBB久久久| 久久99热这里只有精品66| 久久久91人妻无码精品蜜桃HD| 国产精品久久久久…| 国产精品久久久久国产A级| 亚洲精品国产美女久久久| 久久久久久午夜精品| 久久无码AV一区二区三区| 一级A毛片免费观看久久精品| 久久婷婷色综合一区二区| 久久久精品人妻无码专区不卡| 久久福利片| 香蕉久久AⅤ一区二区三区| 性做久久久久久免费观看| 久久久久亚洲AV无码专区首JN|