select()在send()之后不会超时
select() wont timeout after send()
我开始锁定套接字编程,遇到了一点小麻烦:我在下面创建了一个小程序,它通过udp发送消息,如果可能的话,在循环中接收消息。稍后我想尝试使用多个套接字,所以我使用select()
。
当我使用我的127.0.0.1
时,select()
在第一个循环中(在send()
之后(给出超时,但之后它总是返回1
,指示套接字是可读的,而不接收消息:
//C++
WSADATA wsa;
SOCKADDR_IN RemoteAddr;
SOCKADDR_IN OwnAddr;
SOCKET UDP_Socket1;
fd_set m_Fds;
struct timeval m_Timeout;
int iRemoteAddrLenght = sizeof(SOCKADDR_IN);
int i = 0;
//--Init
WSAStartup (MAKEWORD (2,2), &wsa);
UDP_Socket1 = socket(AF_INET, SOCK_DGRAM, 0);
m_Timeout.tv_sec = 2;
m_Timeout.tv_usec = 0;
RemoteAddr.sin_family = AF_INET;
RemoteAddr.sin_port = htons (2002);
RemoteAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
OwnAddr.sin_family = AF_INET;
OwnAddr.sin_port = htons (2003);
OwnAddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(UDP_Socket1, (SOCKADDR*) &OwnAddr, sizeof(OwnAddr));
for(;;)
{
//..//
//--send
sendto(UDP_Socket1, sSend.c_str(), strlen(sSend.c_str()), 0 , (SOCKADDR*)&RemoteAddr, sizeof(RemoteAddr));
//--select & recv
FD_ZERO(&m_Fds);
FD_SET(UDP_Socket1,&m_Fds);
i = select(sizeof(m_Fds)*8, &m_Fds, NULL, NULL, &m_Timeout);
if(i > 0)
{
recvfrom(UDP_Socket1, m_szBuff, 256, 0, (SOCKADDR*) &RemoteAddr, &m_iRemoteAddrLenght);
} //if
else if(i < 1) // "0" in 1st loop, then "1" =(
{
cout << "Udp Timeout" << endl;
} //else if
} //for
send
返回56
(字节发送(带WSAGetLastError: 0
recvfrom
返回-1
带WSAGetLastError: 10054
我很感谢您的帮助,为什么select()
在应该超时时返回1
您可以忽略UDP的这类错误。有些操作系统会报告它们,有些则不会。它们基本上毫无意义。
相关文章:
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- C++减少modbus_connect超时
- 没有超时的C++条件变量
- 如何在C++(VS2010)中设置超时读取USB端口?
- C++卷曲柱在curl_easy_perform超时
- 如何在Qt 4.8中阻止/忽略/丢弃早于特定超时的用户输入事件
- 如何改进我的代码,使其不会因超时而终止?(黑客排名挑战)
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- C++:函数外部的超时功能
- 使用boost::multiprecision cpp_int左移时出现超时错误
- QTimer 超时不会在单元测试中触发
- 使用单体计时器的pthread_cond_timedwait有时会比预期晚超时
- 超时后,线程睡眠不会继续执行
- ZMQ::send() 抛出异常并终止 QNX 进程.为什么以及如何从中恢复?
- 接受超时的 TCP 连接
- 为 g++ build 设置超时,为 Sublime Text 运行?
- 如何通过命令行工具在 COIN-OR Cbc 中设置超时?
- 高CPU使用率,在API桌面复制中获取帧之间具有不同的超时间隔
- 在UNIX中通过recv/send交换数据时,如何正确使用缓冲区
- select()在send()之后不会超时