• <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上來的.
            客戶端是代碼片段,需要自已調整一下代碼.  回復  更多評論
              

            久久国产精品无码一区二区三区| 99久久国产免费福利| 欧美成a人片免费看久久| 久久精品国产欧美日韩99热| 久久国产亚洲精品| 国产精品美女久久久| 亚洲国产精品综合久久一线| 久久久久久久久无码精品亚洲日韩| 99久久综合国产精品二区| 最新久久免费视频| 久久国产乱子精品免费女| 久久午夜免费视频| 51久久夜色精品国产| 老色鬼久久亚洲AV综合| 开心久久婷婷综合中文字幕| 久久99国产综合精品免费| 一本久久精品一区二区| 日本精品久久久中文字幕| 人妻无码精品久久亚瑟影视| 国产亚洲精久久久久久无码AV| 色综合久久中文字幕无码| 一本色道久久88综合日韩精品 | 久久夜色精品国产www| 久久成人国产精品| A级毛片无码久久精品免费| 久久天天躁狠狠躁夜夜不卡| 亚洲欧美日韩精品久久| 国产情侣久久久久aⅴ免费| 久久AV高潮AV无码AV| 久久久精品国产| 综合久久精品色| 欧美日韩精品久久久久| 亚洲人成无码久久电影网站| 人妻丰满?V无码久久不卡| 久久精品国产精品亚洲人人| 久久国产成人| 伊人精品久久久久7777| 午夜视频久久久久一区 | 一本色道久久综合狠狠躁篇 | 狠狠色丁香久久婷婷综合_中| 久久国产精品二国产精品|