UDP用多线程如何实现????

vcScholar 2008-07-22 04:09:22
小弟想知道如何用多线程实现UDP之间数据的接收
具体要求: 有多个套接字同时接收数据,每个套接字在一个单独的线程中不断的接收网络中发送过来的数据。
我的做法是: 1. 在OnInitDialog()中创建CSocket套接字,然后启动线程。
m_uSocket.Create(5800, SOCK_DGRAM);
AfxBeginThread(ReceiveFunc, this, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
2. 定义函数ReceiveFunc().
UINT CUDPThDlg::ReceiveFunc(LPVOID p)
{
unsigned char *buff;
buff = new unsigned char[10];
CString szIP("127.0.0.1");
UINT uPort = 6800;
while(m_bRun) //此时m_bRun位TRUE
{
m_uSocket.ReceiveFrom(buff, 10, szIP, uPort, 0);
CString str(buff);
m_edit1.SetWindowText(str);
Sleep(50);
}
delete []buff;

return 0;
}

请问各位大侠这样写有错误吗? 可以实现我所需要的功能不??? 很想知道大家的看法,希望大家能给些建议,小弟我还是个新手,在这里发自心底的感谢各位。
还有在编译时报错: error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (void *)'
这是什么原因了????
谢谢大家看了我的啰嗦文章!!
...全文
908 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Torch009 2008-07-23
  • 打赏
  • 举报
回复
不要使用MFC的套接字类
CrazyMan1984 2008-07-23
  • 打赏
  • 举报
回复
不要使用MFC的套接字类,否则,你会死得很惨,尤其是多线程,哈哈。

注意使用detach和attach函数,使用mfc的套接字类,可以通过这两个函数来切换套接字对应的线程,不能使用静态链接MFC库。
annvily 2008-07-22
  • 打赏
  • 举报
回复
AfxBeginThread(ReceiveFunc, this)就可以了
另外UINT CUDPThDlg::ReceiveFunc(LPVOID p)的声明要static类型
cnzdgs 2008-07-22
  • 打赏
  • 举报
回复
把线程函数的参数强制转换为CUDPThDlg*类型,用该指针来访问类中的非静态成员,参考LS代码。
mzy2003 2008-07-22
  • 打赏
  • 举报
回复
UINT CUDPThDlg::ReceiveFunc(LPVOID p)
{
CUDPThDlg *pThis=(CUDPThDlg*)p;//得到对话框指针
unsigned char *buff;
buff = new unsigned char[10];
CString szIP("127.0.0.1");
UINT uPort = 6800;
while(TRUE)
{
pThis->m_uSocket.ReceiveFrom(buff, 10, szIP, uPort, 0); //这里修改了
CString str(buff);
pThis->m_edit1.SetWindowText(str); //这里修改了
}
delete []buff;

return 0;
}

既然使用的是CSocket,在OnReceive里接收,这样更好些,有数据到达,才开始接收.这样就省去了这个线程了.
thirddata 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 vcScholar 的回复:]
我在函数声明处加了static,但是程序中我定义的成员变量m_uSocket,和编辑框控制变量m_edit1都有问题了啊?? 这是怎么回事,希望您帮助下我,打搅您了。非常感谢!
UINT CUDPThDlg::ReceiveFunc(LPVOID p)
{
unsigned char *buff;
buff = new unsigned char[10];
CString szIP("127.0.0.1");
UINT uPort = 6800;
while(TRUE)
{
m_uSocket.ReceiveFrom(buff, 10, szIP, uPort, 0);
CString str(buff);
m_e…
[/Quote]

因为你的函数变成了static,所以不认识m_uSocket这些成员了,把对话框的指针传进来,使用对话框的指针操作这些成员
such as:
CUDPThDlg* pThis = (CUDPThDlg*)p;
pThis->m_uSocket
...
vcScholar 2008-07-22
  • 打赏
  • 举报
回复
各位大侠帮帮忙啊!!!不甚感激!
本人很急,需马上知道原因所在啊!! 谢谢了。。。。。。
vcScholar 2008-07-22
  • 打赏
  • 举报
回复
我在函数声明处加了static,但是程序中我定义的成员变量m_uSocket,和编辑框控制变量m_edit1都有问题了啊?? 这是怎么回事,希望您帮助下我,打搅您了。非常感谢!
UINT CUDPThDlg::ReceiveFunc(LPVOID p)
{
unsigned char *buff;
buff = new unsigned char[10];
CString szIP("127.0.0.1");
UINT uPort = 6800;
while(TRUE)
{
m_uSocket.ReceiveFrom(buff, 10, szIP, uPort, 0);
CString str(buff);
m_edit1.SetWindowText(str);
}
delete []buff;

return 0;
}

错误消息:
F:\C++Ex\UDPTh\UDPThDlg.cpp(184) : error C2228: left of '.ReceiveFrom' must have class/struct/union type
F:\C++Ex\UDPTh\UDPThDlg.cpp(186) : error C2228: left of '.SetWindowTextA' must have class/struct/union type
gaoteng1984 2008-07-22
  • 打赏
  • 举报
回复
把ReceiveFunc改成静态函数,因为CreateThread不认识“类成员函数”,他把所有函数都认为是普通函数,换句话说,他不认识this指针。
cnzdgs 2008-07-22
  • 打赏
  • 举报
回复
把ReceiveFunc在类中声明为静态函数:
static UINT ReceiveFunc(LPVOID p);
thirddata 2008-07-22
  • 打赏
  • 举报
回复
几个问题:
1,把sleep去掉,你的RecvFrom本身就已经阻塞在哪里的了。
2,如果发的数据很多,一次RecvFrom有可能接不完,这样你需要重新组织你的CString str(buff),进行拼接。
3,error C2665错误的意思你的线程函数ReceiveFunc是非静态的,把它改成static函数吧 。
scq2099yt 2008-07-22
  • 打赏
  • 举报
回复
这个错误跟Sleep没有太大关系
是参数不符合的问题,我现在也遇到这个问题,还没解决,如果你改为CreateThread则不会有这个错误,不过CreateThread有可能会内存泄露。
vcScholar 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangjia184 的回复:]
Sleep(50); 《----

一般来说要开2组线程池, 一组发送 一组接收

中间用Sleep是不行的。 应该使用某种通知机制。
[/Quote]

看不大懂,希望还能够讲得更仔细些!!!
我仅仅至需要在接收时运行在新线程中,发送用按钮相应事件即可了!
CodeProject-Jerry 2008-07-22
  • 打赏
  • 举报
回复
Sleep(50); 《----

一般来说要开2组线程池, 一组发送 一组接收

中间用Sleep是不行的。 应该使用某种通知机制。
vcScholar 2008-07-22
  • 打赏
  • 举报
回复
为什么没有人回答了,小弟刚刚才注册的,所以分数比较少。
希望各位不要嫌弃

18,356

社区成员

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

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