TCP UDP超时代码段demo
2012-03-08 20:07
225 查看
UDP的recvfrom超时:
fd_set ReadSet;
FD_ZERO(&ReadSet);
FD_SET(sockEncoder,&ReadSet);
timeout.tv_sec = 1;
timeout.tv_usec = 0;
ret = select(0, &ReadSet, NULL, NULL, &timeout);
if(ret>0)
{
ret = recv(sockEncoder, buf, sizeof(buf), 0);
if(0 > ret)
{
cout<<"SendToEncoder() "<<"System Error: recv from encoder"<<", error-"<<GetLastError()<<endl;
closesocket(sockEncoder);
return FALSE;
}
if(0 == ret)
{
cout<<"SendToEncoder() "<<"recv from encoder"<<" timeout"<<endl;
return FALSE;
}
TCP connect 超时:
//使不阻塞在connect
unsigned long ul = 1;
ioctlsocket(sockEncoder, FIONBIO, &ul); //设置为非阻塞模式
bool suc = false;
timeval tm;
fd_set set;
char error;
int len = sizeof(char);
if(connect(sockEncoder, (sockaddr*)&encoderAddr, sizeof(sockaddr)) == -1)
{
tm.tv_sec = 3;
tm.tv_usec = 0;
FD_ZERO(&set);
FD_SET(sockEncoder, &set);
if( select(sockEncoder+1, NULL, &set, NULL, &tm) > 0)//是否可写
{
getsockopt(sockEncoder,SOL_SOCKET,SO_ERROR,&error,&len);
if(error == 0)
suc = true;//correct IP
else
suc = false;
}
else
suc = false;//wrong IP after time_out
}
else
suc = true;
ul = 0;
ioctlsocket(sockEncoder, FIONBIO, &ul); //设置为阻塞模式
if(!suc)
{
closesocket( sockEncoder );
return FALSE;
}
//下面进行发包收包操作
fd_set ReadSet;
FD_ZERO(&ReadSet);
FD_SET(sockEncoder,&ReadSet);
timeout.tv_sec = 1;
timeout.tv_usec = 0;
ret = select(0, &ReadSet, NULL, NULL, &timeout);
if(ret>0)
{
ret = recv(sockEncoder, buf, sizeof(buf), 0);
if(0 > ret)
{
cout<<"SendToEncoder() "<<"System Error: recv from encoder"<<", error-"<<GetLastError()<<endl;
closesocket(sockEncoder);
return FALSE;
}
if(0 == ret)
{
cout<<"SendToEncoder() "<<"recv from encoder"<<" timeout"<<endl;
return FALSE;
}
TCP connect 超时:
//使不阻塞在connect
unsigned long ul = 1;
ioctlsocket(sockEncoder, FIONBIO, &ul); //设置为非阻塞模式
bool suc = false;
timeval tm;
fd_set set;
char error;
int len = sizeof(char);
if(connect(sockEncoder, (sockaddr*)&encoderAddr, sizeof(sockaddr)) == -1)
{
tm.tv_sec = 3;
tm.tv_usec = 0;
FD_ZERO(&set);
FD_SET(sockEncoder, &set);
if( select(sockEncoder+1, NULL, &set, NULL, &tm) > 0)//是否可写
{
getsockopt(sockEncoder,SOL_SOCKET,SO_ERROR,&error,&len);
if(error == 0)
suc = true;//correct IP
else
suc = false;
}
else
suc = false;//wrong IP after time_out
}
else
suc = true;
ul = 0;
ioctlsocket(sockEncoder, FIONBIO, &ul); //设置为阻塞模式
if(!suc)
{
closesocket( sockEncoder );
return FALSE;
}
//下面进行发包收包操作
相关文章推荐
- 关于linux下的udp/tcp通信设置发送sendto/接收recvfrom信息超时的参数。解决通道堵塞问题。
- 基于TCP UDP 协议的聊天小DEMO
- libjingle源码解析(6)-【PseudoTcp】建立UDP之上的TCP(4):超时与重传
- Java-Tcp/Ip-CS时间问询UDP应用Demo
- JAVA网络编程入门的两个demo(TCP+UDP)
- Esp8266学习之旅⑧ 你要找的8266作为UDP、TCP客户端或服务端的角色通讯,都在这了。(带Demo)
- TCP UDP select超时总结
- JAVA网络编程入门的两个demo(TCP+UDP)
- JAVA网络编程入门的两个demo(TCP+UDP)
- TCP/UDP select超时处理
- Socket,TCP,UDP,HTTP基本通信原理和OC版本Demo
- libjingle源码解析(6)-【PseudoTcp】建立UDP之上的TCP(4):超时与重传
- UDP/TCP穿越NAT的P2P通信方法研究(UDP/TCP打洞 Hole Punching)
- Qt中网络编程(网络接口,TCP,UDP)
- TCP和UDP的“保护消息边界”(粘包、半包)
- TCP与UDP协议分析
- C++ TCP/UDP 网络编程笔记
- TCP链接从服务器到客户端DEMO
- TCP与UDP
- TCP、UDP的区别及OSI与TCP/IP参考模型