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

            山寨:不是最好的,是最適合我們的!歡迎體驗山寨 中文版MSDN

            Blog @ Blog

            當華美的葉片落盡,生命的脈絡才歷歷可見。 -- 聶魯達

            常用鏈接

            統計

            積分與排名

            BBS

            Blog

            Web

            最新評論

            連接服務流程代碼

            void CTCPUDPDlg::OnBtnConnect() //連接服務

            bool CSocketComm::ConnectTo(LPCTSTR strDestination, LPCTSTR strServiceName, int nProtocol, int nType)

            BOOL CSocketComm::WatchClientSocket()
            //啟動Socket線程

            UINT WINAPI CSocketComm::SocketClientThreadProc(LPVOID pParam)
            //客戶端線程


            void CSocketComm::ClientRun()//Client主線程函數

            //附件:
            //連接服務: socket();bind();connect()
            bool CSocketComm::ConnectTo(LPCTSTR strDestination, LPCTSTR strServiceName, int nProtocol, int nType)
            {
                
            // 如果socket已經打開
                if ( IsOpen() )
                    
            return false;

                SOCKADDR_IN sockAddr 
            = {0};
                
            //創建一個SOCKET
                SOCKET sock  = ::socket(nProtocol, nType, 0);
                
            if(sock != INVALID_SOCKET)
                
            {
                    
            // 讓socket綁定一個地址
                    TCHAR strHost[HOSTNAME_SIZE] = 0 };
                    
            if (false == CSocketComm::GetLocalName( strHost, sizeof(strHost)/sizeof(TCHAR)))
                    
            {
                        closesocket( sock );
                        
            return false;
                    }

                    
            //獲取本機IP
                    sockAddr.sin_addr.s_addr = htonl( CSocketComm::GetIPAddress( strHost ) );
                    sockAddr.sin_family 
            = nProtocol;

                    
            if ( SOCKET_ERROR == bind(sock, (LPSOCKADDR)&sockAddr, sizeof(SOCKADDR_IN)))
                    
            {
                        closesocket( sock );
                        
            return false;
                    }

                    
            // 獲得目標地址
                    if ( strDestination[0])
                    
            {
                        sockAddr.sin_addr.s_addr 
            = htonl(CSocketComm::GetIPAddress( strDestination ) );
                    }

                    
            // 獲得端口
                    sockAddr.sin_port = htons( GetPortNumber( strServiceName ));
                    
            if ( 0 != sockAddr.sin_port )
                    
            {
                        
            // 連接服務器
                        if (SOCKET_ERROR == connect( sock, (LPSOCKADDR)&sockAddr, sizeof(SOCKADDR_IN)))
                        
            {
                            closesocket( sock );
                            
            return false;
                        }


                        
            // 保存socket
                        m_hSocket = (HANDLE) sock;
                        
            return true;
                    }

                }

                
            else
                
            {
                    CString strError;
                    strError.Format(
            "Create Socket Error Code: %d",GetLastError());
                    AfxMessageBox(strError,MB_ICONERROR);
                }

                
            return false;
            }

            //啟動Socket線程
            BOOL CSocketComm::WatchClientSocket()
            {
                
            //首先判斷線程是否啟動
                if(!IsStart())
                
            {
                    
            //判斷是否打開通信,即socket是否成功創建
                    if(IsOpen())
                    
            {
                        HANDLE hThread;
                        UINT uiThreadId 
            = 0;
                        
            //啟動線程,使用_beginthreadex
                        hThread = (HANDLE)_beginthreadex(NULL,    // 安全參數
                                                            0,    // 堆棧
                                            SocketClientThreadProc,    // 線程程序
                                                        this,    // 線程參數
                                            CREATE_SUSPENDED,    //創建模式
                                                &uiThreadId);    // 線程ID
                        
            //如果線程不為空
                        if(hThread != NULL)
                        
            {
                            
            //繼續線程
                            ::ResumeThread(hThread);
                            m_hThread 
            = hThread;
                            
            return TRUE;
                        }

                    }

                }

                
            return false;
            }


            //客戶端線程
            UINT WINAPI CSocketComm::SocketClientThreadProc(LPVOID pParam)
            {
                
            //reinterpret_cast用于各種指針的轉化
                CSocketComm* pThis = reinterpret_cast<CSocketComm*>(pParam);
                _ASSERTE( pThis 
            != NULL );

                pThis
            ->ClientRun();

                
            return 1L;
            }


            //Client主線程函數ReadComm():
            void CSocketComm::ClientRun()
            {
                BYTE buffer[BUFFER_SIZE];
                DWORD dwBytes 
            = 0L;

                HANDLE hThread 
            = ::GetCurrentThread();
                DWORD dwTimeout 
            = DEFAULT_TIMEOUT;
                
                
            //如果SOCKET 已經創建
                while(IsOpen())
                
            {
                    
            //采用阻塞式SOCKET,等待事件通知
                    dwBytes = ReadComm(buffer,sizeof(buffer),dwTimeout);
                    
            // 如果有錯誤發生
                    if (dwBytes == (DWORD)-1)
                    
            {
                        
            // 如果要關閉,則不發送事件
                        if(IsOpen())
                            OnEvent( EVT_CONDROP,ServerSockAddr); 
            // 失去連接
                        break;
                    }


                    
            // 是否有數據收到
                    if (IsSmartAddressing() && dwBytes == sizeof(SOCKADDR_IN))
                        OnEvent( EVT_ZEROLENGTH,ServerSockAddr);
                    
            else if(dwBytes > 0L)
                    
            {
                        OnDataReceived(buffer, dwBytes);
                    }


                    Sleep(
            0);
                }


            }


            //讀數據函數select();recvfrom();recv()
            DWORD CSocketComm::ReadComm(LPBYTE lpBuffer, DWORD dwSize, DWORD dwTimeout)
            {
                _ASSERTE(IsOpen());
                _ASSERTE(lpBuffer 
            != NULL);
                
            if(lpBuffer == NULL || dwSize<1L)
                    
            return 0L;

                fd_set fdRead 
            = {0};
                TIMEVAL stTime;
                TIMEVAL 
            *pstTime = NULL;

                
            if(INFINITE != dwTimeout)
                
            {
                    stTime.tv_sec
            =0;
                    stTime.tv_usec
            =dwTimeout*1000;
                    pstTime 
            = &stTime;
                }

                SOCKET s
            =(SOCKET)m_hSocket;
                
            //設定描述符
                if(!FD_ISSET(s,&fdRead))
                    FD_SET(s,
            &fdRead);

                
            //選擇函數,設定超時時間
                DWORD dwBytesRead = 0L;
                
            int res = select(s+1,&fdRead,NULL,NULL,pstTime);
                
            if(res > 0)
                
            {
                    
            if(IsBroadCast() || IsSmartAddressing())
                    
            {
                        SOCKADDR_IN sockAddr 
            = {0};//獲得地址
                        int nOffset = IsSmartAddressing()?sizeof(sockAddr):0;
                        
            int nLen = sizeof(sockAddr);
                        
            if(dwSize < (DWORD)nLen)//緩沖區太小
                        {
                            ::SetLastError(ERROR_INVALID_USER_BUFFER);
                            
            return -1L;
                        }

                        
            //獲得數據
                        res = ::recvfrom(s,(LPSTR)&lpBuffer[nOffset],dwSize,0,(LPSOCKADDR)&sockAddr,&nLen);
                        
                        memset(
            &sockAddr.sin_addr,0,sizeof(sockAddr.sin_zero));
                        
            if(res>=0)
                        
            {
                            LockList();
            //鎖定地址列表
                            
            //刪除調重復地址
                            SockAddrIn sockin;
                            sockin.SetAddr(
            &sockAddr);
                            m_AddrList.remove(sockin);
                            m_AddrList.insert(m_AddrList.end(),sockin);

                            
            if(IsSmartAddressing())
                            
            {
                                memcpy(lpBuffer,
            &sockAddr,sizeof(sockAddr));
                                res
            +=sizeof(sockAddr);
                            }

                            UnlockList();
            //解開地址列表
                        }

                    }

                    
            else
                    
            {
                        res 
            = recv(s,(LPSTR)lpBuffer,dwSize,0);
                    }

                    dwBytesRead 
            = (DWORD)((res>0)?(res):(-1));
                }

                
                 
            return dwBytesRead;//返回記錄長度
            }

            posted on 2008-05-02 10:10 isabc 閱讀(708) 評論(1)  編輯 收藏 引用 所屬分類: 分享代碼

            評論

            # re: 連接服務流程代碼[未登錄] 2008-11-18 10:39 1

            11111  回復  更多評論   

            廣告信息(免費廣告聯系)

            中文版MSDN:
            歡迎體驗

            久久亚洲精品成人无码网站| 久久一区二区免费播放| 伊人久久大香线蕉av不变影院| 久久99精品国产99久久6男男| 亚洲国产成人久久综合一| 久久国产精品二国产精品| 欧美日韩精品久久免费| 久久国产免费观看精品3| 久久国产高清一区二区三区| 少妇久久久久久被弄到高潮| 久久99国产精品尤物| 精品欧美一区二区三区久久久| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 亚洲国产另类久久久精品小说| 久久精品亚洲一区二区三区浴池 | 久久精品国产一区二区三区不卡 | 久久久国产精品网站| 99久久国产亚洲综合精品| 久久香蕉国产线看观看乱码| 无码人妻久久一区二区三区蜜桃| 久久婷婷激情综合色综合俺也去 | 99久久人人爽亚洲精品美女| 久久久久久伊人高潮影院| 久久精品国产亚洲综合色| 97久久国产综合精品女不卡| 精品综合久久久久久88小说| 久久精品中文闷骚内射| 亚洲国产欧洲综合997久久| 人妻无码精品久久亚瑟影视| 久久影视国产亚洲| 久久国产精品二国产精品| 99久久精品国产一区二区三区| 波多野结衣中文字幕久久| 久久婷婷五月综合97色| 国内高清久久久久久| 久久久久亚洲av综合波多野结衣| 武侠古典久久婷婷狼人伊人| 欧美日韩成人精品久久久免费看| 久久99精品久久久久久秒播| 狠狠人妻久久久久久综合| 99久久精品国产综合一区|