使用CSocket的自动接收时怎么区分接收UDP和TCP

怎嘛回事 2012-12-18 02:23:09
我现在在做UDP和TCP的通信(分开通信的,但是是在同一个对话框中实现),现在UDP的通信已经实现了(发送指令之后可以自动接收),使用的CSocket类,虚继承的OnReceive可以实现自动接收。但是我现在需要在原来的UDP程序中加入TCP的通信(使用其中一个通信方式的时候,另一个关闭),这两个通信是分开的,但是是在同一个对话框中,现在的问题是,我关闭UDP之后,使用TCP发送指令之后,接收的时候TCP接收,UDP的也接收了。这应该怎么处理呢?

有人说分别创建TCP和UDP的对象,使用不同的对象调用各自的接收函数。
但是我不太明白应该怎么做。

class CUDPDlg;//这是对话框
class CUdpSocket : public CSocket
{
public:
CString TmpBuffer;
public:
CUdpSocket();
void GetDlg(CUDPDlg *dlg);
CUDPDlg *pDlg;
virtual ~CUdpSocket();
public:
virtual void OnReceive(int nErrorCode);
protected:

SOCKADDR_IN m_clientAddr;

};

void CUDPDlg::OnBnClickedStart() //这是创建的UDP
{

m_pSocket = new CUdpSocket();
m_pSocket->Create(48899, SOCK_DGRAM,NULL);
m_pSocket->Connect("10.10.100.254", 48899);
}}void CUDPDlg::OnBnClickedWifiasserver()//这是TCP
{
m_pSocketTCP = new CUdpSocket();
m_pSocketTCP->Create();
m_pSocketTCP->Connect("10.10.100.254",8899);
}

void CUdpSocket::OnReceive(int nErrorCode) //CSocket中的自动接收函数
{

TCHAR recBuf[1024];
int len = sizeof(SOCKADDR_IN);
ZeroMemory(recBuf, sizeof(recBuf));
//..................UDP接收数据.........................
int recBytes = 0;
recBytes = ReceiveFrom(recBuf, 1023, (SOCKADDR*)&m_clientAddr, &len, 0);
//这是UDP的接收,可以正常工作。

那么怎么在这个函数中也能实现TCP的接收呢?而且让两个接收不混乱。

之前我在这里直接添加的TCP的接收函数,当返回的时候,UDP和TCP的接收函数都接收到了数据。

先在这谢谢大神了。
CSocket::OnReceive(nErrorCode);
}
...全文
209 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
怎嘛回事 2012-12-19
  • 打赏
  • 举报
回复
引用 12 楼 YunXia98Li 的回复:
再实现个CTcpSocket就行了,不要绞在一起。或者直接用socket api,通过句柄区分,参考这的socket例子: http://download.csdn.net/detail/geoff08zhang/4571358
你的这建议不错。之前我没想到,我就想怎么在同一个OnReceive中实现了,原来还可以再建立一个。 我去学习下socket api 谢谢
怎嘛回事 2012-12-19
  • 打赏
  • 举报
回复
谢谢大神们,我知道问题在哪里了。做标记是可以的。 在Dlg的构造函数里面对flag进行初始化是不行的。 我现在把它放在了Dlg的全局区进行初始化就可以了,同时声明成static类型的。 然后在CUdpSocket中就可以使用了。
怎嘛回事 2012-12-19
  • 打赏
  • 举报
回复
引用 13 楼 yaozhiyong110 的回复:
引用 11 楼 songlinok 的回复:引用 9 楼 yaozhiyong110 的回复: if进不去那就说明flag是false 为什么是false自己去看代码 调试的时候是可以看到flag的值的,这个值确实是true。 也让我很郁闷,程序就是不进if函数 你构造的时候就设置这个值 可能是设置值之前数据就先接收了 所以进OnRecive的时候flag……
一会我给贴图上来
yaozhiyong110 2012-12-19
  • 打赏
  • 举报
回复
引用 11 楼 songlinok 的回复:
引用 9 楼 yaozhiyong110 的回复: if进不去那就说明flag是false 为什么是false自己去看代码 调试的时候是可以看到flag的值的,这个值确实是true。 也让我很郁闷,程序就是不进if函数
你构造的时候就设置这个值 可能是设置值之前数据就先接收了 所以进OnRecive的时候flag还是初始的false 你调试都不会吗? 代码怎么走的不知道?
YunXia98Li 2012-12-19
  • 打赏
  • 举报
回复
再实现个CTcpSocket就行了,不要绞在一起。或者直接用socket api,通过句柄区分,参考这的socket例子: http://download.csdn.net/detail/geoff08zhang/4571358
怎嘛回事 2012-12-19
  • 打赏
  • 举报
回复
引用 9 楼 yaozhiyong110 的回复:
if进不去那就说明flag是false 为什么是false自己去看代码
调试的时候是可以看到flag的值的,这个值确实是true。 也让我很郁闷,程序就是不进if函数
怎嘛回事 2012-12-19
  • 打赏
  • 举报
回复
引用 4 楼 yaozhiyong110 的回复:
你的CUdpSocket自己加个标记表示是tcp还是udp 构造对象的时候 设置好这个标记 在OnReceive里面根据这个标记 就知道应该receive还是receivefrom了
添加标记的不好用呀,我用着的时候就没反应。调试也进不了函数
yaozhiyong110 2012-12-19
  • 打赏
  • 举报
回复
if进不去那就说明flag是false 为什么是false自己去看代码
怎嘛回事 2012-12-19
  • 打赏
  • 举报
回复
引用 7 楼 wyx100 的回复:
回复于: 2012-12-18 16:02:15 你的CUdpSocket自己加个标记表示是tcp还是udp 构造对象的时候 设置好这个标记 在OnReceive里面根据这个标记 就知道应该receive还是receivefrom了
其实之前我就用标记了,之前还是只有UDP的时候,当选择UDP的时候,flag = true;初始化的时候flag = false; 然后在OnReceive中判断 if( flag )...;但是这样不行。 调试的时候,选择的UDp,但是进不去if。
wyx100 2012-12-18
  • 打赏
  • 举报
回复
回复于: 2012-12-18 16:02:15 你的CUdpSocket自己加个标记表示是tcp还是udp 构造对象的时候 设置好这个标记 在OnReceive里面根据这个标记 就知道应该receive还是receivefrom了
怎嘛回事 2012-12-18
  • 打赏
  • 举报
回复
嗯,谢谢两位的指点。晚上我试试
youngwolf 2012-12-18
  • 打赏
  • 举报
回复
m_pSocket1和m_pSocket2已经是CUdpSocket对象了! m_pSocket1和m_pSocket2是CUDPDlg的两个成员。 你再想想!
yaozhiyong110 2012-12-18
  • 打赏
  • 举报
回复
你的CUdpSocket自己加个标记表示是tcp还是udp 构造对象的时候 设置好这个标记 在OnReceive里面根据这个标记 就知道应该receive还是receivefrom了
怎嘛回事 2012-12-18
  • 打赏
  • 举报
回复
在CUdpSocket中创建2个对象m_pSocket1、m_pSocket2之后,在OnReceive中怎么使用呢?怎么能知道哪种情况下使用哪个对象呢? 是在CUDPDlg类中添加标记吗?
怎嘛回事 2012-12-18
  • 打赏
  • 举报
回复
呵呵,见笑了。本来打算只做UDP的。后来有添加的TCP的。 怎么在OnReceive中使用m_pSocket1、m_pSocket2呢? 这来你个对象是在对话框类中声明,还是在CSocket类中? 谢谢
youngwolf 2012-12-18
  • 打赏
  • 举报
回复
两个CUdpSocket对象(这名字起得!),m_pSocket1和m_pSocket2就解决你的问题了。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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