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

            Sunshine Alike

            半完美主義

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              35 Posts :: 1 Stories :: 56 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(15)

            積分與排名

            • 積分 - 50536
            • 排名 - 452

            最新隨筆

            最新評論

            ? 在VS下建一個對話框的MFC程序UDPChat,去掉所有帶的控件。加入以下控件:
            按鈕一個?? IDC_BTN_SEND
            編程框三個 IDC_EDIT_PORT(端口號),IDC_EDIT_REC(顯示接收到的消息),IDC_EDIT_SEND(輸入發(fā)送內(nèi)容)
            IP控件一個 IDC_IPADDRESS1

            UDPChatDlg.h中加入
            #define??? WM_RECDATA WM_USER+1
            來定義一個消息號,用來處理接收到消息的事件

            然后是以下方法聲明:
            private:
            ????
            bool?InitSocket(void);
            ????
            static?DWORD?WINAPI?RecProc(LPVOID?lpParam);
            ????afx_msg?LRESULT?OnRecData(WPARAM?wParam,LPARAM?lParam);
            ????afx_msg?
            void?OnBnClickedBtnSend();

            消息映射里加入兩條:
            ON_MESSAGE(WM_RECDATA, OnRecData)//處理收到消息事件
            ON_BN_CLICKED(IDC_BTN_SEND, &CTcpChatDlg::OnBnClickedBtnSend)//處理按鈕點(diǎn)擊事件

            至此,萬事具備,只欠東風(fēng)。

            首先窗口初始化函數(shù)OnInitDialog里加入
            ????//構(gòu)造一個新線程用于監(jiān)聽接收
            ????HANDLE?hThread?=?
            ????????CreateThread(NULL,?
            0,?RecProc,?(LPVOID)m_hWnd,?0,?NULL);
            ????CloseHandle(hThread);

            ????((CIPAddressCtrl
            *)GetDlgItem(IDC_IPADDRESS1))->SetAddress(127,?0,?0,?1);
            ????SetDlgItemText(IDC_EDIT_PORT,?_T(
            "6000"));
            后面就是四個相關(guān)的成員函數(shù),需要注意的是在線程必須使用靜態(tài)函數(shù)或者全局函數(shù),因?yàn)檫@程序一開始,線程就運(yùn)行起來了,而成員方法在那個時候可能還沒有生成出來。
            bool?CTcpChatDlg::InitSocket()
            {

            ????WORD?wVersionRequested;
            ????WSADATA?wsaData;
            ????wVersionRequested?
            =?MAKEWORD(?2,?2?);

            ????
            int?err?=?WSAStartup(?wVersionRequested,?&wsaData?);
            ????
            if?(?err?!=?0?)?{
            ????????
            /*?Tell?the?user?that?we?could?not?find?a?usable?*/
            ????????
            /*?WinSock?DLL.??????????????????????????????????*/
            ????????
            return?false;
            ????}

            ????
            if?(?LOBYTE(?wsaData.wVersion?)?!=?2?||
            ????????HIBYTE(?wsaData.wVersion?)?
            !=?2?)?{
            ????????????
            /*?Tell?the?user?that?we?could?not?find?a?usable?*/
            ????????????
            /*?WinSock?DLL.??????????????????????????????????*/
            ????????????WSACleanup(?);
            ????????????
            return?false;?
            ????}
            ????
            return?true;
            }


            DWORD?WINAPI?CTcpChatDlg::RecProc(LPVOID?lpParam)
            {

            ????HWND?hWnd?=?(HWND)lpParam;

            ????
            //-----------------------------------------------
            ????
            //?Create?a?receiver?socket?to?receive?datagrams
            ????SOCKET?RecvSocket?=?socket(AF_INET,?SOCK_DGRAM,?0);
            ????
            if(INVALID_SOCKET?==?RecvSocket)
            ????{????????????
            ????????::AfxMessageBox(_T(
            "socket創(chuàng)建失敗"));
            ????????
            return?1;
            ????}

            ????
            //-----------------------------------------------
            ????
            //?Bind?the?socket?to?any?address?and?the?specified?port.
            ????SOCKADDR_IN?RecvAddr;
            ????RecvAddr.sin_family?
            =?AF_INET;
            ????RecvAddr.sin_port?
            =?htons(6000);
            ????RecvAddr.sin_addr.S_un.S_addr?
            =?htonl(INADDR_ANY);

            ????
            if(SOCKET_ERROR?==?bind(RecvSocket,?(SOCKADDR?*)?&RecvAddr,?sizeof(RecvAddr)))
            ????{
            ????????closesocket(RecvSocket);
            ????????::AfxMessageBox(_T(
            "bind失敗"));
            ????????
            return?1;
            ????}

            ????
            //-----------------------------------------------
            ????
            //?Call?the?recvfrom?function?to?receive?datagrams
            ????
            //?on?the?bound?socket.
            ????int?retval;

            ????
            char?RecvBuf[1024];
            ????
            char?tmpBuf[1024];

            ????sockaddr_in?SenderAddr;
            ????
            int?SenderAddrSize?=?sizeof(SenderAddr);

            ????
            while(true)
            ????{
            ????????retval?
            =?recvfrom(RecvSocket,?
            ????????????RecvBuf,?
            ????????????
            1024,?
            ????????????
            0,?
            ????????????(SOCKADDR?
            *)&SenderAddr,?
            ????????????
            &SenderAddrSize);
            ????????
            if(SOCKET_ERROR?==?retval)
            ????????{
            ????????????CString?strError;
            ????????????strError.Format(
            "error?code?:?%d",?WSAGetLastError());
            ????????????::AfxMessageBox(strError);
            ????????????
            break;
            ????????}
            ????????sprintf_s(tmpBuf,?
            1024,?"收到%s消息:?%s",?inet_ntoa(SenderAddr.sin_addr),?RecvBuf);
            ????????
            //發(fā)送消息
            ????????::PostMessage(hWnd,?WM_RECDATA,?0,?(LPARAM)tmpBuf);
            ????}

            ????
            //清理工作
            ????closesocket(RecvSocket);
            ????WSACleanup();
            ????
            return?0;//成功
            }


            LRESULT?CTcpChatDlg::OnRecData(WPARAM?wParam,LPARAM?lParam)
            {
            ????CString?str((
            char*)lParam);
            ????CString?origin;
            ????GetDlgItemText(IDC_EDIT_REC,origin);
            ????str?
            +=?"\r\n";
            ????str?
            +=?origin;
            ????SetDlgItemText(IDC_EDIT_REC,str);
            ????SetDlgItemText(IDC_EDIT_SEND,?_T(
            ""));
            ????
            return?0;
            }

            void?CTcpChatDlg::OnBnClickedBtnSend()
            {
            ????DWORD?dwIP;
            ????((CIPAddressCtrl
            *)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);
            ????CString?strPort;
            ????GetDlgItemText(IDC_EDIT_PORT,?strPort);
            ????
            //創(chuàng)建發(fā)送地址信息
            ????SOCKADDR_IN?addrTo;
            ????addrTo.sin_family?
            =?AF_INET;
            ????addrTo.sin_port?
            =?htons(atoi(strPort));
            ????addrTo.sin_addr.S_un.S_addr?
            =?htonl(dwIP);

            ????CString?strMsg;
            ????GetDlgItemText(IDC_EDIT_SEND,?strMsg);

            ????SOCKET?sock?
            =?socket(AF_INET,?SOCK_DGRAM,?0);

            ????
            if(SOCKET_ERROR?==?
            ????????sendto(
            ????????sock,?strMsg,?
            ????????strMsg.GetLength()
            +1,?0,?
            ????????(SOCKADDR?
            *)&addrTo,?sizeof(addrTo)
            ????????))
            ????{
            ????????CString?strError;
            ????????strError.FormatMessage(
            "Send?Failed,?Error?Code:?%d",?WSAGetLastError());
            ????????MessageBox(strError);
            ????}
            ????
            ????closesocket(sock);
            }

            posted on 2009-05-06 17:08 Sunshine Alike 閱讀(324) 評論(0)  編輯 收藏 引用 所屬分類: WinAPI應(yīng)用程序
            91精品国产91久久久久久蜜臀| 成人a毛片久久免费播放| 久久这里的只有是精品23| 久久人人爽人人精品视频| 精品久久久久久中文字幕大豆网| 精品伊人久久大线蕉色首页| 久久最近最新中文字幕大全| 久久青青国产| 日韩精品久久久久久久电影蜜臀| 国产三级精品久久| 久久婷婷国产综合精品| 久久天天躁狠狠躁夜夜2020| 久久久久久久久无码精品亚洲日韩 | 影音先锋女人AV鲁色资源网久久| 久久发布国产伦子伦精品| 久久久久97国产精华液好用吗| 一本久久知道综合久久| AA级片免费看视频久久| 亚洲精品乱码久久久久久久久久久久 | 99久久做夜夜爱天天做精品| 亚洲嫩草影院久久精品| 久久精品中文騷妇女内射| 久久久久久久久66精品片| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 久久精品天天中文字幕人妻| 无夜精品久久久久久| 精品久久久久久无码中文野结衣| AV无码久久久久不卡蜜桃| 青青草原精品99久久精品66| 久久久一本精品99久久精品88| 日韩va亚洲va欧美va久久| 久久激情五月丁香伊人| 激情久久久久久久久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久精品aⅴ无码中文字字幕不卡| 久久久久久久亚洲精品| 久久精品无码一区二区三区免费| 99热都是精品久久久久久| 精品多毛少妇人妻AV免费久久| 亚洲综合精品香蕉久久网97| 国内精品久久久久久久影视麻豆 |