4121|8

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

EVC++4.0 UDC程序,为什么可以发送数据,不能接收数据 [复制链接]

EVC++4.0 UDC程序,为什么可以发送数据,不能接收数据,(和VC的UDP程序通信。)

最新回复

我也遇到这个问题  楼主是如何解决的  详情 回复 发表于 2012-5-17 14:46
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
原因很多啊,有可能是代码造成的,

也很有可能是连接线造成的啊.
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这个问题像是一个谜语。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
是这样的我按照,EVC高级编程及其应用开发一书第十章的UDP程序,编译完了以后,我在网上下载了一个UDP调试工具(windows下的),然后,用EVC编写的UDPDemo给那个调试工具发送数据,可以接收到,但是UDP调试工具给EVC程序发送消息就收不到。同时用两个EVC程序对发,也是接收不到,不知道为什么。下面是源代码。(有点长)
// UDP_CE.cpp: implementation of the CUDP_CE class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "UDP_CE.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CUDP_CE::CUDP_CE()
{
       
}

CUDP_CE::~CUDP_CE()
{
       
}


/*
*函数介绍:打开UDP通讯端口
*入口参数:pWnd: 指定父窗体指针
           localPort: 指定远程UDP端口
           romoteHost:指定远程IP地址
           remotePort:指定远程UDP端口
*出口参数:(无)
*返回值:1代表成功;-1,-2,-3等都代表失败
*/
DWORD CUDP_CE::Open(CWnd* pWnd,int localPort,LPCTSTR remoteHost,int remotePort)
{
       
        WSADATA wsa;
       
        m_pOwnerWnd = pWnd;
       
        //加载winsock动态链接库
        if (WSAStartup(MAKEWORD(1,1),&wsa) != 0)
        {
                return -1;//代表失败
        }
       
        //创建UDP套接字
        m_UDPSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
        if (m_UDPSocket == INVALID_SOCKET)
        {
                return -2;
        }
       
        SOCKADDR_IN localAddr;
        localAddr.sin_family = AF_INET;
        localAddr.sin_port = htons(localPort);
        localAddr.sin_addr.s_addr=INADDR_ANY;
       
        //绑定地址
        if(bind(m_UDPSocket,(sockaddr*)&localAddr,sizeof(localAddr))!=0)
        {
                return -3;
        }
       
       
        //设置非堵塞通讯
        DWORD ul= 1;
        ioctlsocket(m_UDPSocket,FIONBIO,&ul);

        //创建一个线程退出事件
        m_ExitThreadEvent        = CreateEvent(NULL,TRUE,FALSE,NULL);
       
        //创建通讯线程
        AfxBeginThread(RecvThread,this);
       
        m_RemoteAddr.sin_family = AF_INET;
        m_RemoteAddr.sin_port = htons(remotePort);
        //此处要将双字节转换成单字节
        char ansiRemoteHost[255];
        ZeroMemory(ansiRemoteHost,255);
        WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,remoteHost,wcslen(remoteHost)
                ,ansiRemoteHost,wcslen(remoteHost),NULL,NULL);
        m_RemoteAddr.sin_addr.s_addr=inet_addr(ansiRemoteHost);
        return 1;
}

/*
*函数介绍:关闭UDP通讯端口
*入口参数:(无)
*出口参数:(无)
*返 回 值:1代表成功;-1,-2等都代表失败
*/
DWORD CUDP_CE::Close(void)
{
        //设置通讯线程退出事件,通知线程退出
        SetEvent(m_ExitThreadEvent);
        Sleep(2000);
        //关闭线程句柄
        CloseHandle(m_ExitThreadEvent);
        //关闭socket
        if (closesocket(m_UDPSocket) == SOCKET_ERROR)
        {
                return -1;
        }
       
        //释放socket资源
        if (WSACleanup() == SOCKET_ERROR)
        {
                return -2;
        }
        return 1;
}

/*
*这里是张国威自己修改过的,编译成功,100%可以运行!!!!
*函数介绍:发送数据
*入口参数:dataPriority: 数据优先级
           dataType: 数据类型
           buf:缓冲区数据
           len:缓冲数据长度
*出口参数:(无)
*返回值:发送成功代表实际发送的字节数,否则返回-1
*/
bool CUDP_CE::SendData(const char *buf, int len)
{
        int nBytes = 0;
        int nErrorCode;
        nBytes = sendto(m_UDPSocket,buf,len,0,(sockaddr*)&m_RemoteAddr,sizeof(m_RemoteAddr));               
        if (nBytes==SOCKET_ERROR )       
        {               
                nErrorCode = WSAGetLastError();       
                m_OnUdpError(m_pOwnerWnd,nErrorCode);       
                return false;       
        }
        return true;
}


/*
*函数介绍:接收线程函数
*入口参数:lparam : 指传进线程的参数
*出口参数:(无)
*返 回 值:无意义。
*/
UINT CUDP_CE::RecvThread(LPVOID lparam)
{
        CUDP_CE *pSocket;
        pSocket = (CUDP_CE*)lparam;
        fd_set fdRead;
        int ret;
        TIMEVAL        aTime;
        char * recvBuf=NULL;
        aTime.tv_sec = 1;
        aTime.tv_usec = 0;
        SOCKADDR_IN tmpAddr;
        int tmpRecvLen;
        int recvLen;
        int iErrorCode;
       
        char * recvedBuf = NULL;
        int recvedBufLen;

       

        while (TRUE)
        {
               
        //收到退出事件,结束线程
                if (WaitForSingleObject(pSocket->m_ExitThreadEvent,0) == WAIT_OBJECT_0)
                {
                        break;
                }

                //将set初始化空集合
                FD_ZERO(&fdRead);
               
                //将pSocket->m_UDPSocket套接字添加到集合中
                FD_SET(pSocket->m_UDPSocket,&fdRead);
               
                //调用select函数,判断套接字I/O状态
                ret = select(0,&fdRead,NULL,NULL,&aTime);
               
                if (ret == SOCKET_ERROR)
                {
                        iErrorCode = WSAGetLastError();
                        pSocket->m_OnUdpError(pSocket->m_pOwnerWnd,iErrorCode);
                        break;
                }
               
                if (ret > 0)
                {
                        if (FD_ISSET(pSocket->m_UDPSocket,&fdRead))
                        {
                               
                tmpAddr.sin_family=AF_INET;            
                tmpAddr.sin_port = htons(pSocket->m_RemoteAddr.sin_port);
                                tmpAddr.sin_addr.s_addr =INADDR_ANY;
                tmpRecvLen = sizeof(tmpAddr);
                               
                               
                                recvBuf = new char[1024];
                                recvedBuf = new char[1024];
                                ZeroMemory(recvBuf,1024);
                                ZeroMemory(recvedBuf,1024);
                                recvLen = recvfrom(pSocket->m_UDPSocket,recvBuf, 1024,0,(SOCKADDR*)&tmpAddr,&tmpRecvLen);
                                if (recvLen == SOCKET_ERROR)
                                {
                                        iErrorCode = WSAGetLastError();
                                        pSocket->m_OnUdpError(pSocket->m_pOwnerWnd,iErrorCode);
                                        break;
                                }
                                else if (recvLen == 0)
                                {
                                        iErrorCode = WSAGetLastError();
                                        pSocket->m_OnUdpError(pSocket->m_pOwnerWnd,iErrorCode);       
                                        break;
                                }
                                 
                                else
                                {
                                        //此处添加解析程序,将接收到的数据解析后,
                           pSocket->m_OnUdpRecv(pSocket->m_pOwnerWnd,recvBuf,recvedBufLen,(SOCKADDR*)&tmpAddr);
                                        delete []recvBuf;
                                        recvBuf = NULL;
                                        delete []recvedBuf;
                                        recvedBuf = NULL;
                                }
                               
                        }
                }
        }
        return 0;
}

/*
*函数介绍:处理接收到的数据包
*入口参数:inBuf: 待处理的缓冲区
           inBufLen:待处理的缓冲区长度
*出口参数:dataPriority:数据优先级
           dataType:数据类型
           outBuf:处理后的缓冲区数据
           outBufLen:处理后的缓冲区数据长度
*返 回 值:合法则返回true,否则,返回false;
*/
bool CUDP_CE::HandlePackage(const char *inBuf,int inBufLen
                                                        ,char *outBuf,int &outBufLen)
{
        CString csBuf;
        csBuf = inBuf;
        int iPosHead = pos(FRAMEHEAD,inBuf,inBufLen);
        int iPosTail = pos(FRAMETAIL,inBuf,inBufLen);
        //没有查到包头或包尾
        if ((iPosHead == -1) || (iPosTail == -1))
        {
                return FALSE;
        }
        //如果包头位置大于等于包尾位置,就退出
        if (iPosHead >= iPosTail)
        {
                return FALSE;
        }
        //得到数据包长度
        int iPackLen;
        CopyMemory(&iPackLen,inBuf+iPosHead+4,4);
        //判断包长度是否正确
        if (iPackLen != iPosTail - iPosHead - 8)
        {
                return FALSE;
        }
       
        CopyMemory(outBuf,inBuf+8,iPackLen);
        outBufLen = iPackLen;
        return TRUE;
}

/*
*函数介绍:查找一个字符串的位置
*入口参数:aSubStr: 待查找的子串
           aBuf:待查找的缓冲区
           len:待查找的缓冲区长度
*出口参数:(无)
*返回值:找到的话,返回在父串中的位置,否则返回-1.
*/
int CUDP_CE::pos(LPCSTR aSubStr, const char *aBuf, int len)
{
        bool aResult = TRUE;
        int subLen = strlen(aSubStr);
    for ( int i=0;i         {
                aResult = TRUE;
                for (int j=0;j                 {
                        if (*(aBuf+i+j) != aSubStr[j])
                        {
                                aResult = FALSE;
                                break;
                        }
                        int k = 0;
                }
                if (aResult)
                {
                        return i;
                }
        }
        return -1;
}
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
// UDPDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "UDP.h"
#include "UDPDlg.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CUDPDlg 对话框

CUDPDlg::CUDPDlg(CWnd* pParent /*=NULL*/)
        : CDialog(CUDPDlg::IDD, pParent)
        , m_RemoteHost(_T("172.19.37.13"))
        , m_RemotePort(9000)
        , m_LocalPort(9001)
        , m_SendStr(_T("test test test"))
        , m_RecvStr(_T(""))
{
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CUDPDlg::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        DDX_Text(pDX, IDC_EDIT_REMOTEHOST, m_RemoteHost);
        DDX_Text(pDX, IDC_EDIT_REMOTEPORT, m_RemotePort);
        DDX_Text(pDX, IDC_EDIT_LOCALPORT, m_LocalPort);
        DDX_Text(pDX, IDC_EDIT_SENDSTR, m_SendStr);
        DDX_Text(pDX, IDC_EDIT_RECVSTR, m_RecvStr);
}

BEGIN_MESSAGE_MAP(CUDPDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
        ON_WM_SIZE()
#endif
        //}}AFX_MSG_MAP
        ON_BN_CLICKED(IDC_BTNOPEN, &CUDPDlg::OnBnClickedBtnopen)
        ON_BN_CLICKED(IDC_BTNCLOSE, &CUDPDlg::OnBnClickedBtnclose)
        ON_BN_CLICKED(IDC_BTNSEND, &CUDPDlg::OnBnClickedBtnsend)
END_MESSAGE_MAP()


// CUDPDlg 消息处理程序

BOOL CUDPDlg::OnInitDialog()
{
        CDialog::OnInitDialog();

        // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
        //  执行此操作
        SetIcon(m_hIcon, TRUE);                        // 设置大图标
        SetIcon(m_hIcon, FALSE);                // 设置小图标

        // TODO: 在此添加额外的初始化代码
        m_bFullScreen=false;
        return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CALLBACK CUDPDlg::OnUdpCERecv(CWnd * pWnd,char* buf,int nLen,sockaddr * addr)
{
        CUDPDlg * pDlg;
        pDlg = (CUDPDlg*)pWnd;
        CEdit *pRecvStrEdit = (CEdit*)pDlg->GetDlgItem(IDC_EDIT_RECVSTR);
        ASSERT(pRecvStrEdit != NULL);
        CString strRecv (buf);
        pRecvStrEdit->SetWindowText(strRecv);
}

void CALLBACK CUDPDlg::OnUdpCEError(CWnd * pWnd,int nError)
{
   
}


#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CUDPDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
        DRA::RelayoutDialog(
                AfxGetInstanceHandle(),
                this->m_hWnd,
                DRA::GetDisplayMode() != DRA::Portrait ?
                        MAKEINTRESOURCE(IDD_UDP_DIALOG_WIDE) :
                        MAKEINTRESOURCE(IDD_UDP_DIALOG));
}
#endif


void CUDPDlg::OnBnClickedBtnopen()
{
   UpdateData(TRUE);
   m_CEUdp.m_OnUdpRecv = OnUdpCERecv;
   m_CEUdp.m_OnUdpError = OnUdpCEError;
   DWORD nResult = m_CEUdp.Open(this,m_LocalPort,m_RemoteHost.GetBuffer(m_RemoteHost.GetLength()),m_RemotePort);
   if (nResult <=0)
   {
           AfxMessageBox(_T("打开端口失败"));
           return;
   }
}

void CUDPDlg::OnBnClickedBtnclose()
{
  m_CEUdp.Close();       
}

void CUDPDlg::OnBnClickedBtnsend()
{
   UpdateData(TRUE);
   char *pBuffer = NULL;
   pBuffer = new char[m_SendStr.GetLength()+1];
   ZeroMemory(pBuffer, m_SendStr.GetLength()+1);
   USES_CONVERSION;
   pBuffer=(char*)W2A((LPCTSTR)m_SendStr);
   m_CEUdp.SendData(pBuffer,strlen(pBuffer));       
  delete[] pBuffer;
}
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
我是在一台单机上,将机器设置为环路测试的。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

7
 
问题找到了,设置的本地端口没有被使用,
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 
我不会测试啊~~
我该怎么设置啊
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 

我也遇到这个问题  楼主是如何解决的

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表