mfc实现UDP通信

11 篇文章 1 订阅
#include "stdafx.h"
#include "UDP.h"
#include "CDV.h"
#include <WS2tcpip.h>
#include <iphlpapi.h>
#pragma comment(lib, "iphlpapi.lib")

UDP::UDP()
{
  m_connectSocket = INVALID_SOCKET;
}


UDP::~UDP()
{
  CloseConnect();
}


UDP::UDP(u_short port)
{
  m_connectSocket = INVALID_SOCKET;
  if (-1 == ConnectServerBC(port))
    delete this;
}

int UDP::ConnectServerBC(u_short port)
{
  //return ConnectServer(ip, strtoul(port, NULL, 10));

  CloseConnect();


  WSADATA wsaData;
  struct addrinfo *result = NULL,
    *ptr = NULL,
    hints;

  int iResult;

  // Initialize Winsock
  iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

  if (iResult != 0) {
    ::AfxMessageBox(_T("网络连接失败"), MB_ICONWARNING, TRUE);
    return -1;
  }

  m_ip = "255.255.255.255";
  m_port.Format("%d", port);

  m_connectSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  if (m_connectSocket == INVALID_SOCKET) {
    WSACleanup();
    return -1;
  }

  const int opt = -1;
  int nb = 0;
  nb = setsockopt(m_connectSocket, SOL_SOCKET, SO_BROADCAST, (char*)&opt, sizeof(opt));
  if (nb == -1)
  {
    return -1;
  }
  

  if (m_connectSocket == INVALID_SOCKET) {
    WSACleanup();
    //::AfxMessageBox(_T("网络连接失败"), MB_ICONWARNING, TRUE);
    return -1;
  }
  //::AfxMessageBox(_T("恭喜,网络连接成功!"), MB_ICONWARNING, TRUE);
  return 0;
}

int UDP::CloseConnect()
{
  if (m_connectSocket == INVALID_SOCKET)
    return 0;

  int iResult = closesocket(m_connectSocket);
  if (iResult == SOCKET_ERROR) {
    //wprintf(L"关闭网络出错: %d\n", WSAGetLastError());
    WSACleanup();
    return -1;
  }
  // Clean up and quit.
  WSACleanup();

  return 0;
}

//只用于本地局域网查询npc
int UDP::BCSearch(char * sbuf, int slen, CStringArray &rarray, int rTimeout)
{
  ASSERT(sbuf && slen);
  int ret = -1;
  char rbuf[200] = { 0 };
  int rlen = 200;

  if (m_connectSocket == INVALID_SOCKET)
    return -1;

  rarray.RemoveAll();
  
  sockaddr_in senderAddr, destAddr, sourAddr;
  /*设置源地址为本地广播地址*/
  //bzero(&sourAddr, sizeof(struct sockaddr_in));
  sourAddr.sin_family = AF_INET;
  sourAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
  sourAddr.sin_port = htons(10);

  //destAddr.sin_family = AF_INET;
  //destAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  //destAddr.sin_port = htons(10);

  int addrSize = sizeof(destAddr);
  int iResult;

  iResult = sendto(m_connectSocket, sbuf, slen, 0, (SOCKADDR *)& sourAddr, sizeof(sourAddr));
  if (iResult == SOCKET_ERROR) {
    return -1;
  }

  int timeout = rTimeout;
  ret = setsockopt(m_connectSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
  do {

    iResult = recvfrom(m_connectSocket, rbuf, rlen, 0, (SOCKADDR *)& destAddr, &addrSize);

    int error = WSAGetLastError();
    if (iResult > 0)
    {
      rarray.Add(rbuf);
    }
    else if (WSAETIMEDOUT == error)
    {
      return 0;
    }
    else
    {
      return -1;
    }
  } while (true);
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于MFCUDP通信是一种基于用户数据报协议的通信方式。UDP(User Datagram Protocol)是一种无连接的、不可靠的传输协议,适用于传输速度要求较高、数据可靠性要求较低的场景。 MFC(Microsoft Foundation Class)是微软提供的一套用于开发Windows图形界面应用程序的C++类库。通过MFC,我们可以方便地创建窗口、对话框以及控件等。 在基于MFCUDP通信中,我们可以使用MFC提供的Socket类进行通信。首先,我们需要创建一个UDP套接字对象,通过调用Create函数来创建。然后,可以使用Bind函数来绑定本地端口。 对于发送数据报,我们可以调用SendTo函数来发送数据至指定的目标地址和端口。对于接收数据报,可以调用ReceiveFrom函数来接收来自远程主机的数据。 在MFC中,可以使用消息机制来处理收到的数据。当有数据到达时,Socket类会触发一个自定义的消息,我们可以在消息的处理函数中对数据进行处理。可以通过重载窗口或对话框类的消息映射函数来捕获和处理这个消息。 需要注意的是,UDP是一种无连接的传输协议,所以在通信过程中无法保证数据的可靠性。为了提高数据的可靠性,可以在应用层实现一些重传机制来保证数据的送达。 基于MFCUDP通信具有灵活性和高效性的特点,适用于一些需要高速传输但对数据可靠性要求不高的场景,比如实时数据传输、视频流传输等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值