CmySocket的两个对象,绑定了两个UDP端口,mySocket.cpp中的OnReceive内ReceiveFrom如何区分数据是发给哪个端口的?

tangshiping 2008-08-28 02:34:20
例:
我从CSocket继承了一个CmySocket,在mySocket.cpp中的OnReceive内用ReceiveFrom进行了数据的接收处理。


我用CmySocket生命了两个变量A,B。A绑定端口5000,B绑定端口5001。现在另外有三台机器D、E、F往本机的两个端口分别发送UDP数据,那么在ReceiveFrom中如何区别收到的数据是准备发给哪个端口的,因为不同的端口收到的数据我要用A和B两个对象做不同的处理。

函数的参数为:
int ReceiveFrom( void* lpBuf, int nBufLen, CString& rSocketAddress, UINT& rSocketPort, int nFlags = 0 );

第一个参数是接收缓冲区,第二个是缓冲区长度,第三个是输出参数,代表发送方的地址,第四个是发送方的端口,第五个是标志。

谢谢解答
...全文
321 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
scq2099yt 2008-08-29
  • 打赏
  • 举报
回复
你的实例怎么来的?
是new出来的还是直接定义的?
new出来的需要delete
tangshiping 2008-08-29
  • 打赏
  • 举报
回复
突然发现CmySocket生成两个实例的时候程序就崩溃,奇怪,从CSocket继承一个空的类来声明两个实例也一样
qinqinhao 2008-08-29
  • 打赏
  • 举报
回复
ding
tangshiping 2008-08-29
  • 打赏
  • 举报
回复
目前状况:有一定的实时性要求且通信数据量较大。
api socket没用过,可能要多花一些时间成本。先分两个端口测一下看看
hurryboylqs 2008-08-29
  • 打赏
  • 举报
回复
CmySocket *pRec;
没问题。

同时再CmySocket *pRec1;就直接崩溃了。
-----------------

自己调试下就知道原因了
tangshiping 2008-08-29
  • 打赏
  • 举报
回复
CmySocket *pRec;
没问题。

同时再CmySocket *pRec1;就直接崩溃了。
里面确实new了,但del了。而且程序还没有走到new的那一步就崩了,在
CmySocket *pRec1;处就结束了
taitanyt 2008-08-28
  • 打赏
  • 举报
回复
对于非实时或要求不高的场合可以用csocket类,对于有实时性要求或通信数据量较大的的场合建议一定用api socket
不知道你的用在什么场合
一般来说不要小看机器的以太网通信处理能力,主要是把自己的程序处理好就一般没问题
tangshiping 2008-08-28
  • 打赏
  • 举报
回复
下班 明天加分继续
tangshiping 2008-08-28
  • 打赏
  • 举报
回复
看函数的样子应该是可以 谢谢
另:1:用多个不同的端口收数据应该可以减轻一个端口收UDP数据所带来的数据丢失问题吧?
2:多个实例处理自己的数据,它们操作是并行的吗?担心它们是执行完一个执行另一个,那样还是丢数据
taitanyt 2008-08-28
  • 打赏
  • 举报
回复
或者用getpeername()
简述: 获取与套接口相连的端地址。

int PASCAL FAR getpeername( SOCKET s, struct sockaddr FAR* name, int FAR* namelen);

sockaddr 中就有端口号

我没有用过该函数,估计可以

tangshiping 2008-08-28
  • 打赏
  • 举报
回复
taitanyt 的意思是这样啊 理解了 谢谢
taitanyt 2008-08-28
  • 打赏
  • 举报
回复
class CmySocket
{
....


....

int m_port;
}

CmySocket::CmySocket(int aaa)
{
m_port=aaa;

create_sock();
bind(m_port,....);

}

CmySocket a(5000),b(5001)

CmySocket::OnRecive()
{
if(m_port==5000) is A recv
else if(m_port==5001) is B recv

}


wanbangxinji 2008-08-28
  • 打赏
  • 举报
回复
每个socket对象所绑定的端口本来是知道的,现在的问题是在他们的类实现中如何在Onreceive中区分开到底数据是给哪个端口的。因为不管给哪个的都会在这里响应到。
tangshiping 2008-08-28
  • 打赏
  • 举报
回复
port应该是CmySocket的成员变量
===============

好像不是列
taitanyt 2008-08-28
  • 打赏
  • 举报
回复
CmySocket中判断一些本port是A还是B不就行了,port应该是CmySocket的成员变量
tangshiping 2008-08-28
  • 打赏
  • 举报
回复
我觉得这样只是多花了一些清理现场和函数跳转的代价,并没有使得效率提高啊似乎。我的理解是不是不对?
tangshiping 2008-08-28
  • 打赏
  • 举报
回复
void WINAPI DealData(CSocket * desSocket)
{
desSocket->GetSockName...
.....
}

CmySocket::Onreceive(..)
{
DealData(this);
}
拼命三郎 是上面的意思吗?
tangshiping 2008-08-28
  • 打赏
  • 举报
回复
你要是将数据抛给创建A B对象的类处理,那就更方便了
————————————————
Onreceive就是创建A B对象的类CmySocket的成员函数啊。


“观察者”模式
套接口类做消息的发送者 :是A,B实例来发送数据吗?
上层创建套接字实例的类做消息接收者 :CmySocket做接收者?怎么接收呢?我只知道reveivefrom

套接字类有数据过来就抛给消息接收者处理,传递一个this指针做参数抛出去
消息处理者得到数据后根据this参数是不是A 还是B 分别处理之... :这一步怎么做

谢谢了 这个模式看起来狠不错

hurryboylqs 2008-08-28
  • 打赏
  • 举报
回复
触发数据接收的不就是Onreceive吗?
--------------

估计你是在Onreceive里接收后就直接处理了
这样你就按上面说的getsockname获得该套接字绑定的地址和端口就好了,不过效率不高
还不如直接保存到一个变量里。

你要是将数据抛给创建A B对象的类处理,那就更方便了

我现在告诉你使用设计模式里的“观察者”模式 很方便

套接口类做消息的发送者
上层创建套接字实例的类做消息接收者

套接字类有数据过来就抛给消息接收者处理,传递一个this指针做参数抛出去

消息处理者得到数据后根据this参数是不是A 还是B 分别处理之...

tangshiping 2008-08-28
  • 打赏
  • 举报
回复
我这么问的原因是因为:
我有一个服务端,一个类的一个实例绑定一个端口,收数据有点吃力,收得的UDP的音频数据,只要客户端上了三台就有点掉帧,声音开始断续。所以想多分出一个端口来分担压力,不知道这样设计是不是于事无补。
加载更多回复(11)

18,356

社区成员

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

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