UDP怎样实现异步和线程池。 UDP怎样实现异步和线程池?找了半天也没有这方面的资料!不只到谁可以帮帮忙 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我不懂你的意思,请说清楚一点我只能告诉你UDP是异步通信,TCP是同步通信 UDP本身就是异步,线程池在很多教程上都有的 线程池也没有什么的,就是刚开始时,就创建一大堆线程.让它们都在SLEEP.当有数据时,就发一条消息给它,让它去工作.UDP的话,就只用两个线程就行了,一个发送,一个接收.因为UDP是无连接的.所以每发送一个包,都是有IP,PORT的.接收的情况也一样. udp就是异步的因为他是主动接收线程池是一个线程的容器而已 UDP套接字发送和接受数据时不回出现阻塞么? 先比较一下两种传输方式:利用WinSock进行无连接的通信UDP(用户数据报协议):通过UDP协议我们可以向指定IP地址的主机发送数据,同时也可以从指定IP地址的主机接收数据,发送和接收方处于相同的地位没有主次之分。利用CSocket操纵无连接的数据发送很简单,首先生成一个本地套接口(需要指明SOCK_DGRAM标记),然后利用 int CAsyncSocket::SendTo( const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress = NULL, int nFlags = 0 )发送数据, int CAsyncSocket::ReceiveFrom( void* lpBuf, int nBufLen, CString& rSocketAddress, UINT& rSocketPort, int nFlags = 0 )接收数据。利用UDP协议发送和接收都可以是双向的,就是说任何一个主机都可以发送和接收数据。但是UDP协议是无连接的,所以发送的数据不一定能被接收,此外接收的顺序也有可能与发送顺序不一致。下面的代码演示了如何建立连接和发送/接收数据:/*发送方在端口6800上向接收方端口6801发送数据*///发送方代码:BOOL CMy62_s1_clientDlg::OnInitDialog(){ CDialog::OnInitDialog(); //创建本地套接口 m_sockSend.Create(6800,SOCK_DGRAM,NULL); //绑定本地套接口 m_sockSend.Bind(6800,"127.0.0.1"); //创建一个定时器定时发送 SetTimer(1,3000,NULL);...}void CMy62_s1_clientDlg::OnTimer(UINT nIDEvent) { static iIndex=0; char szSend[20]; sprintf(szSend,"%010d",iIndex++); //发送UDP数据 int iSend= m_sockSend.SendTo(szSend,10,6801,"127.0.0.1",0); TRACE("sent %d byte\n",iSend);...}//接收方代码BOOL CMy62_s1_serverDlg::OnInitDialog(){ CDialog::OnInitDialog(); //创建本地套接口 m_sockRecv.Create(6801,SOCK_DGRAM,"127.0.0.1"); //绑定本地套接口 m_sockRecv.Bind(6801,"127.0.0.1"); //创建一个定时器定时读取 SetTimer(1,3000,NULL);...}void CMy62_s1_serverDlg::OnTimer(UINT nIDEvent) { char szRecv[20]; CString szIP("127.0.0.1"); UINT uPort=6800; //接收UDP数据 int iRecv =m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0); TRACE("received %d byte\n",iRecv);...}/*接收方采用同步读取数据的方式,所以没有读到数据函数调用将不会返回*/利用WinSock进行有连接的通信TCP(传输控制协议):通过TCP协议我们可以与指定IP地址的主机建立,同时利用建立的连接可以双向的交换数据。利用CSocket操纵有连接数据交换很简单,但是在有连接的通信中必需有一方扮演服务器的角色等待另一方(客户方)的连接请求,所以服务器方需要建立一个监听套接口,然后在此套接口上等待连接。当连接建立后会产生一个新的套接口用于通信。而客户方在创建套接口后只需要简单的调用连接函数就可以创建连接。对于有连接的通信不论是数据的发送还是发送与接收的顺序都是有保证的。下面的代码演示了如何建立连接和发送/接收数据: /*服务器方在端口6802上等待连接,当连接建立后关闭监听套接口客户方向服务器端口6802发起连接请求*/BOOL CMy63_s1_serverDlg::OnInitDialog(){ CDialog::OnInitDialog(); CSocket sockListen; //创建本地套接口 sockListen.Create(6802,SOCK_STREAM,"127.0.0.1"); //绑定参数 sockListen.Bind(6802,"127.0.0.1"); sockListen.Listen(5); //等待连接请求,m_sockSend为成员变量,用于通信 sockListen.Accept(m_sockSend); //关闭监听套接口 sockListen.Close(); //启动定时器,定时发送数据 SetTimer(1,3000,NULL);...}void CMy63_s1_serverDlg::OnTimer(UINT nIDEvent) { static iIndex=0; char szSend[20]; sprintf(szSend,"%010d",iIndex++); //发送TCP数据 int iSend= m_sockSend.Send(szSend,10,0);...}BOOL CMy63_s1_clientDlg::OnInitDialog(){ CDialog::OnInitDialog(); //创建本地套接口 m_sockRecv.Create(); //发起连接请求 BOOL fC=m_sockRecv.Connect("127.0.0.1",6802); TRACE("connect is %s\n",(fC)?"OK":"Error"); //启动定时器,定时接收数据 SetTimer(1,3000,NULL);...}void CMy63_s1_clientDlg::OnTimer(UINT nIDEvent) { char szRecv[20]; //接收TCP数据 int iRecv =m_sockRecv.Receive(szRecv,10,0); TRACE("received %d byte\n",iRecv); if(iRecv>=0) { szRecv[iRecv]='\0'; m_szRecv=szRecv; UpdateData(FALSE); }...} 不是你找不到,而是UDP很少用线程池UDP从头到脚就一个SOCKET, UDP到底有没有必要用线程池或是线程,能不能同过使用多线程来提高性能? 多线程UDP通讯的例子:http://www.vchelp.net/vchelp/zsrc/mudp.asp?type_id=44&class_id=1&cata_id=5&article_id=665&search_term= IO完成端口可以用在UDP上么? 没有必要.UDP用在QQ类的服务器,就只用了SOCKET.用两个线程,一个线程专门发送.SendTo();根据是否有数据来发送,如果没有,就SLEEP那里.一个线程就专门接收.RecvFrom().如果有数据就收到,没有数据,就阻塞在接收那里.只要一接收到数据,就发给别的线程处理.这样又简单,又实用,又高效.为什么要搞那么多的东西的.http://www.eyeteck.com/caimouse/web/BT.htm 菜鸟求助:关于用ReadDirectoryChangesW监控文件夹 时出现问题 新手问题!!! 一个关于CRichEdit添加字体的字符的问题,实在没有办法,这个问题困扰我好几天了 初到vc宝地,问个问题100分献上 如何对dsoframer增加一个插入图片功能?分不够再开贴 就是郁闷啊,CSDN没人帮我问题 有關网絡傳輸文件時用到了CFile的情況! 请问如何获取hint的内容! udp能保证用户数据不损坏吗? 送分呀!!! OnPaint()与OnDraw()有什么区别??????????? 如果动态生成消息映射
我只能告诉你UDP是异步通信,TCP是同步通信
就是刚开始时,就创建一大堆线程.让它们都在SLEEP.
当有数据时,就发一条消息给它,让它去工作.UDP的话,就只用两个线程就行了,
一个发送,一个接收.
因为UDP是无连接的.所以每发送一个包,都是有IP,PORT的.
接收的情况也一样.
线程池是一个线程的容器而已
通过UDP协议我们可以向指定IP地址的主机发送数据,同时也可以从指定IP地址的主机接收数据,发送和接收方处于相同的地位没有主次之分。利用CSocket操纵无连接的数据发送很简单,首先生成一个本地套接口(需要指明SOCK_DGRAM标记),然后利用
int CAsyncSocket::SendTo( const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress = NULL, int nFlags = 0 )发送数据,
int CAsyncSocket::ReceiveFrom( void* lpBuf, int nBufLen, CString& rSocketAddress, UINT& rSocketPort, int nFlags = 0 )接收数据。利用UDP协议发送和接收都可以是双向的,就是说任何一个主机都可以发送和接收数据。但是UDP协议是无连接的,所以发送的数据不一定能被接收,此外接收的顺序也有可能与发送顺序不一致。
下面的代码演示了如何建立连接和发送/接收数据:/*
发送方在端口6800上向接收方端口6801发送数据
*/
//发送方代码:
BOOL CMy62_s1_clientDlg::OnInitDialog()
{
CDialog::OnInitDialog(); //创建本地套接口
m_sockSend.Create(6800,SOCK_DGRAM,NULL);
//绑定本地套接口
m_sockSend.Bind(6800,"127.0.0.1");
//创建一个定时器定时发送
SetTimer(1,3000,NULL);
...
}
void CMy62_s1_clientDlg::OnTimer(UINT nIDEvent)
{
static iIndex=0;
char szSend[20];
sprintf(szSend,"%010d",iIndex++);
//发送UDP数据
int iSend= m_sockSend.SendTo(szSend,10,6801,"127.0.0.1",0);
TRACE("sent %d byte\n",iSend);
...
}//接收方代码
BOOL CMy62_s1_serverDlg::OnInitDialog()
{
CDialog::OnInitDialog(); //创建本地套接口
m_sockRecv.Create(6801,SOCK_DGRAM,"127.0.0.1");
//绑定本地套接口
m_sockRecv.Bind(6801,"127.0.0.1");
//创建一个定时器定时读取
SetTimer(1,3000,NULL);
...
}
void CMy62_s1_serverDlg::OnTimer(UINT nIDEvent)
{
char szRecv[20];
CString szIP("127.0.0.1");
UINT uPort=6800;
//接收UDP数据
int iRecv =m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0);
TRACE("received %d byte\n",iRecv);
...
}
/*
接收方采用同步读取数据的方式,所以没有读到数据函数调用将不会返回
*/
利用WinSock进行有连接的通信TCP(传输控制协议):
通过TCP协议我们可以与指定IP地址的主机建立,同时利用建立的连接可以双向的交换数据。利用CSocket操纵有连接数据交换很简单,但是在有连接的通信中必需有一方扮演服务器的角色等待另一方(客户方)的连接请求,所以服务器方需要建立一个监听套接口,然后在此套接口上等待连接。当连接建立后会产生一个新的套接口用于通信。而客户方在创建套接口后只需要简单的调用连接函数就可以创建连接。对于有连接的通信不论是数据的发送还是发送与接收的顺序都是有保证的。
下面的代码演示了如何建立连接和发送/接收数据: /*
服务器方在端口6802上等待连接,当连接建立后关闭监听套接口
客户方向服务器端口6802发起连接请求
*/
BOOL CMy63_s1_serverDlg::OnInitDialog()
{
CDialog::OnInitDialog(); CSocket sockListen;
//创建本地套接口
sockListen.Create(6802,SOCK_STREAM,"127.0.0.1");
//绑定参数
sockListen.Bind(6802,"127.0.0.1");
sockListen.Listen(5);
//等待连接请求,m_sockSend为成员变量,用于通信
sockListen.Accept(m_sockSend);
//关闭监听套接口
sockListen.Close();
//启动定时器,定时发送数据
SetTimer(1,3000,NULL);
...
}
void CMy63_s1_serverDlg::OnTimer(UINT nIDEvent)
{
static iIndex=0;
char szSend[20];
sprintf(szSend,"%010d",iIndex++);
//发送TCP数据
int iSend= m_sockSend.Send(szSend,10,0);
...
}
BOOL CMy63_s1_clientDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//创建本地套接口
m_sockRecv.Create();
//发起连接请求
BOOL fC=m_sockRecv.Connect("127.0.0.1",6802);
TRACE("connect is %s\n",(fC)?"OK":"Error");
//启动定时器,定时接收数据
SetTimer(1,3000,NULL);
...
}
void CMy63_s1_clientDlg::OnTimer(UINT nIDEvent)
{
char szRecv[20];
//接收TCP数据
int iRecv =m_sockRecv.Receive(szRecv,10,0);
TRACE("received %d byte\n",iRecv);
if(iRecv>=0)
{
szRecv[iRecv]='\0';
m_szRecv=szRecv;
UpdateData(FALSE);
}
...
}
http://www.vchelp.net/vchelp/zsrc/mudp.asp?type_id=44&class_id=1&cata_id=5&article_id=665&search_term=
用两个线程,一个线程专门发送.SendTo();根据是否有数据来发送,如果没有,就SLEEP那里.
一个线程就专门接收.RecvFrom().如果有数据就收到,没有数据,就阻塞在接收那里.
只要一接收到数据,就发给别的线程处理.
这样又简单,又实用,又高效.
为什么要搞那么多的东西的.http://www.eyeteck.com/caimouse/web/BT.htm