| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2137 人关注过本帖
标题:MFC UDP服务器接收数据乱码问题。
只看楼主 加入收藏
yijianhanmei
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2013-6-20
结帖率:87.5%
收藏
已结贴  问题点数:10 回复次数:2 
MFC UDP服务器接收数据乱码问题。
大家好,我在做一个UDP服务器,我想把我的一个设备发送的数据显示出来。可是显示却是乱码。我设备通过发送的数据是0xAA,我想在对话框里显示出AA,下面是我的代码,求哪位大神帮我解决一下问题,有人说是要清空接收缓存,我不知道是怎么做,也不知道是不是这样子的。



// DTUDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "DTU.h"
#include "DTUDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
    CAboutDlg();

// 对话框数据
    enum { IDD = IDD_ABOUTBOX };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CDTUDlg 对话框




CDTUDlg::CDTUDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CDTUDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDTUDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CDTUDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_MESSAGE(WM_RECVDATA,OnRecvData)
    ON_BN_CLICKED(IDC_BUTTON1, &CDTUDlg::OnBnClickedButton1)
END_MESSAGE_MAP()


// CDTUDlg 消息处理程序

BOOL CDTUDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);            // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标
   
    InitSocket();
    RECVPARAM *pRecvParam=new RECVPARAM;
    pRecvParam->sock=m_socket;
    pRecvParam->hwnd=m_hWnd;
    HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);
    CloseHandle(hThread);
    // TODO: 在此添加额外的初始化代码

    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CDTUDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialogEx::OnSysCommand(nID, lParam);
    }
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CDTUDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // 用于绘制的设备上下文

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // 使图标在工作区矩形中居中
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // 绘制图标
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CDTUDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}



BOOL CDTUDlg::InitSocket()
{
    m_socket=socket(AF_INET,SOCK_DGRAM,0);
    if (INVALID_SOCKET==m_socket)
    {
        MessageBox(_T("套接字创建失败!"));
        return FALSE;
    }
    SOCKADDR_IN addrSock;
    addrSock.sin_family=AF_INET;
    addrSock.sin_port=htons(10000);
    addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

    int retval;
    retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
    if (SOCKET_ERROR==retval)
    {
        closesocket(m_socket);
        MessageBox(_T("绑定失败!"));
        return FALSE;
    }
    return TRUE;
}


DWORD WINAPI CDTUDlg::RecvProc(__in  LPVOID lpParameter)
{
    SOCKET sock=((RECVPARAM*)lpParameter)->sock;
    HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;
//接收数据代码
    listen(sock,5);
   
    SOCKADDR_IN addrFrom;
    int len=sizeof(SOCKADDR);
    char recvBuf[100];
    char tempBuf[100];
    int retval;
    while (TRUE)
    {

       retval=recvfrom(sock,recvBuf,100,0,(SOCKADDR*)&addrFrom,&len);
//        retval=recv(sockconn,recvBuf,200,0);
        if (SOCKET_ERROR==retval)
            break;


        sprintf(tempBuf,"%s说:%s",inet_ntoa(addrFrom.sin_addr),recvBuf);
        ::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);
   
   
    }
    return 0;
}

LRESULT  CDTUDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
    CString str((char*)lParam);
    CString strTemp;
    GetDlgItemText(IDC_EDIT_RECV,strTemp);
    str+="\r\n";
    str+=strTemp;
    SetDlgItemText(IDC_EDIT_RECV,str);
    return 0;
}
搜索更多相关主题的帖子: 应用程序 include 服务器 对话框 
2013-08-12 14:50
yuccn
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:7 
“数据是0xAA,我想在对话框里显示出AA”
发过来的(0xAA)是二进制数据?
如果是,至少转 成字符串在显示吧

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-08-12 17:10
yijianhanmei
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2013-6-20
收藏
得分:0 
回复 2楼 yuccn
我确实还只是个菜鸟,请问能告诉我该如何改程序吗?
2013-08-12 20:54
快速回复:MFC UDP服务器接收数据乱码问题。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.061199 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved