• <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++技術中心 閱讀(2934) 評論(2)  編輯 收藏 引用 所屬分類: Windows 網絡編程

            Feedback

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

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

            色偷偷88888欧美精品久久久| 成人综合久久精品色婷婷| 国产成年无码久久久久毛片| 久久偷看各类wc女厕嘘嘘| 亚洲va中文字幕无码久久| 狠狠干狠狠久久| 一本色综合久久| 亚洲女久久久噜噜噜熟女| 国产一级做a爰片久久毛片| 国产高清美女一级a毛片久久w| 久久天天躁狠狠躁夜夜2020| 亚洲欧美伊人久久综合一区二区| 久久免费精品视频| 综合久久国产九一剧情麻豆 | 人妻少妇久久中文字幕一区二区| 99国产欧美久久久精品蜜芽| 久久影院久久香蕉国产线看观看| 国产美女久久精品香蕉69| 伊色综合久久之综合久久| 国产69精品久久久久777| 人妻丰满?V无码久久不卡| 精品久久人妻av中文字幕| 伊人久久亚洲综合影院| 久久夜色精品国产亚洲| 日本强好片久久久久久AAA | 国内精品久久久久| 亚洲va中文字幕无码久久| 亚洲国产精品综合久久一线| 久久香蕉一级毛片| 精品久久一区二区三区| 国产A级毛片久久久精品毛片| 久久久这里有精品中文字幕| 久久er热视频在这里精品| 99久久精品费精品国产一区二区 | 久久亚洲精品国产精品| 亚洲伊人久久成综合人影院| 久久久久国产亚洲AV麻豆| 国内精品久久久久久麻豆| 亚洲一本综合久久| 国内精品久久久久久麻豆| 久久久久久久久久久免费精品|