继承CSocket类,同一地址同时读两个端口,OnReceive事件如何区分端口??

vc8fans 2015-12-15 08:17:06
继承CSocket类 读去UDP广播包,,,
地址 192.168.1.100 先读6001端口是参数 6003端口是数据

继承CSocket类 OnReceive事件如何区分端口??
读的时候是那个端口?? 6001 端口,,还是6003端口

CUdpSocket *m_pSocket1;
CUdpSocket *m_pSocket2;

m_pSocket->Create(6001, SOCK_DGRAM); //6001端口
m_pSocket->Bind(6001, "192.168.1.100");

m_pSocket->Create(6003, SOCK_DGRAM); //6003端口
m_pSocket->Bind(6003, "192.168.1.100");

void CUdpSocket::OnReceive(int nErrorCode) //在公共继承继承CSocket类 如何区分接收到是那个端口数据????
{
// TODO: Add your specialized code here and/or call the base class
CString strBuf;

int len = sizeof(SOCKADDR_IN);
ZeroMemory(recBuf, sizeof(recBuf));

int recBytes = ReceiveFrom(recBuf, 1023, (SOCKADDR*)&m_clientAddr, &len, 0);

if(recBytes==0)
AfxMessageBox(TEXT("UDP连接已经关闭!"));
else
if (SOCKET_ERROR == recBytes)
AfxMessageBox(TEXT("接受数据失败!"));
else
{
strBuf.Format(TEXT("=%d,收到数据: %s"), recBytes, recBuf);
AfxMessageBox(strBuf, MB_OK);
}

CSocket::OnReceive(nErrorCode);
}
...全文
132 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
vc8fans 2015-12-15
  • 打赏
  • 举报
回复
getsockname 来获取绑定的端口 这个函数我不太会用???
vc8fans 2015-12-15
  • 打赏
  • 举报
回复
m_pSocket1->Create(6001, SOCK_DGRAM); //6001端口 m_pSocket->Bind(6001, "192.168.1.100"); m_pSocket2->Create(6003, SOCK_DGRAM); //6003端口 m_pSocket->Bind(6003, "192.168.1.100");
Yofoo 2015-12-15
  • 打赏
  • 举报
回复
如果是2个socket, 可以用 getsockname 来获取绑定的端口, 或者在类中自己定义变量来标记是哪个端口
Yofoo 2015-12-15
  • 打赏
  • 举报
回复
一个UDP的socket不可以绑定2个端口吧 m_pSocket->Bind(6003, "192.168.1.100"); 调试检查下这句是否成功, 看看返回值
笨笨仔 2015-12-15
  • 打赏
  • 举报
回复
开2个线程就行了
vc8fans 2015-12-15
  • 打赏
  • 举报
回复
其实 int recBytes = ReceiveFrom(recBuf, 1023, (SOCKADDR*)&m_clientAddr, &len, 0); 已经返回了(SOCKADDR*)&m_clientAddr, 如何从中分离出端口号, int port= ntohs(m_clientAddr.sin_port); 确分离了 53402的奇怪
信阳毛尖 2015-12-15
  • 打赏
  • 举报
回复
//在这里6001 ,6003都可能相应,如何判断接收到的对应端口 --------------------------------------------------------------------------------- CUdpSocket *m_pSocket1; CUdpSocket *m_pSocket2; m_pSocket1->Create(6001, SOCK_DGRAM); //监听6001端口 m_pSocket->Bind(6001, "192.168.1.100"); m_pSocket2->Create(6003, SOCK_DGRAM); //监听6003端口 m_pSocket->Bind(6003, "192.168.1.100"); ---------------------------------------------------------------------------------------- 有一个最简单的办法,就是CUdpSocket 类中添加一个成员变量,保存Create传入的的端口号啊
vc8fans 2015-12-15
  • 打赏
  • 举报
回复
CUdpSocket *m_pSocket1; CUdpSocket *m_pSocket2; m_pSocket1->Create(6001, SOCK_DGRAM); //监听6001端口 m_pSocket->Bind(6001, "192.168.1.100"); m_pSocket2->Create(6003, SOCK_DGRAM); //监听6003端口 m_pSocket->Bind(6003, "192.168.1.100"); void CUdpSocket::OnReceive(int nErrorCode) //在公共继承继承CSocket类 如何区分接收到是那个端口数据???? { // TODO: Add your specialized code here and/or call the base class CString strBuf; int len = sizeof(SOCKADDR_IN); ZeroMemory(recBuf, sizeof(recBuf)); int recBytes = ReceiveFrom(recBuf, 1023, (SOCKADDR*)&m_clientAddr, &len, 0); if(recBytes==0) AfxMessageBox(TEXT("UDP连接已经关闭!")); else if (SOCKET_ERROR == recBytes) AfxMessageBox(TEXT("接受数据失败!")); else { strBuf.Format(TEXT("=%d,收到数据: %s"), recBytes, recBuf); //在这里6001 ,6003都可能相应,如何判断接收到的对应端口 AfxMessageBox(strBuf, MB_OK); } CSocket::OnReceive(nErrorCode); }

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧