Udp Select
来源:互联网 发布:淘宝怎样打印电子面单 编辑:程序博客网 时间:2024/05/16 15:08
最近的项目开发中,网络部分的实现采用自定义的通讯协议,为了保证服务器安 全稳定运行,保证数据发送速度(相对于TCP来说),采用UDP协议。 UDP 和 TCP的优劣在此不再重复。
在采用UDP协议时候, 问题也就跟着来了。UDP协议的本质决定了数据包的不可靠传输,我们无法知道数据包何时会被遗失,所以采用UDP传输信息,就必须自己控制和解决丢包、超时、重传问题。这是一个很久以来一直都在讨论的且未得到完美解决的问题。
不多说了,下面看一段程序吧。 这是我在一个线程中实现的代码。
// 转载出处,做人要厚道!
DWORD CALLBACK UDPLogin(void *p)
{
fd_set readfds;
struct timeval authtime;
int retries=0,retry_max=10; //重试10次
char SendBuffer[MAXBUFLEN]; //发送区
char RecvBuffer[MAXBUFLEN]; //接收区
int size=sizeof(struct sockaddr);
// 示例发送内容
strcpy(SendBuffer,username); //用户名
strcpy(SendBuffer+strlen(username),password); //密码
// 设置超时时间
authtime.tv_usec = 0L;
authtime.tv_sec = (long)1; // 1秒后重发
while(1)
{
//发送数据
sendto(m_Socket,SendBuffer,MAXBUFLEN,0, (structsockaddr *)&remote_addr,sizeof(remote_addr));
memset(RecvBuffer,0,sizeof(RecvBuffer));
//下面2 句非常重要,为select 函数做准备
FD_ZERO (&readfds);//
FD_SET (m_Socket, &readfds);//
if(select(m_Socket,&readfds,NULL,NULL,&authtime)< 0)
{return -1;}
if (FD_ISSET(m_Socket, &readfds)) // 有东西读,就读
{
recvfrom(m_Socket,RecvBuffer,MAXBUFLEN,0,(structsockaddr *)&remote_addr,&size);
// 读完就可以自己处理一下收到的数据了,省略。。
break;
}
// 如果没东西读,就表示发送失败,或者网络丢包了
// 那么就记录次数
if (++retries >= retry_max)
{
MessageBox(NULL,"请检查网络设置是否正确。然后重启本软件","登陆失败",MB_OK);
return -1;
}
}//while
return 0;
}
其实,上面的关键在于select函数!!
一个FD_ISSET(readfds)就相当通知了readfds可读。
至于struct timeval在此的功能,请查询 select。不同的timeval设置使使select()表现出超时结束、无超时阻塞和轮询三种特性。由于
timeval可精确至百万分之一秒,所以Windows的SetTimer()根本不算什么。你可以用select()做一个超级时钟。
- Udp Select
- udp select
- udp select
- UDP的select用法
- TCP UDP select超时总结
- TCP/UDP select超时处理
- 采用select的udp程序
- UDP发送Select不正确返回的解决办法
- 基于UDP的select函数用法
- udp利用select实现超时重传
- 基于UDP的select函数用法
- select写的UDP/TCP测试服务器
- udp利用select实现超时重传
- TCP & UDP服务器(select和fork)
- UDP并发服务器模型 二:select机制
- 基于UDP的select函数用法
- unix 网络编程---select回射TCP,UDP
- 用select模式实现TCP和UDP的混合监听
- jsp注释及声明等基础用法
- CORBA/TAO使用手记1 -- C/S架构网络通信开发
- F-SLIKAR 多校联合第七场 搜索问题
- 设计一个矩形类,完成计算矩形面积和显示矩形属性的功能。
- VS2005也能运行Cocos2d-x
- Udp Select
- Pydev 在 Eclipse 与 MyEclipse中的安装方法
- 计算机图形学到底讲了什么
- C# 使用HttpWebRequest用Post提交MultiPart数据
- pydev2.5.0+myeclipse9.1
- google地图定位小Demo
- Oracle数据库高级查询(四)子查询和连接查询的综合案例
- Cocos2d-x 的“HelloWorld” 深入分析
- 计算机图形学中的常用模型