首页 \ 问答 \ C ++ recvfrom超时(C++ recvfrom timeout)

C ++ recvfrom超时(C++ recvfrom timeout)

我需要实现以下行为:当服务器启动时,它应该使用广播检查现有服务器。 然后它等待回答。

但是,如何设置等待超时?

int optval = 1;
char buff[BUFF_SIZE];
SOCKADDR_IN addr;
int length = sizeof(addr);

if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&optval, sizeof(optval)) == SOCKET_ERROR) throw(errors::SETSOCKOPT);

addr->sin_family = AF_INET;
addr->sin_port = htons(this->serverPort);
addr->sin_addr.s_addr = INADDR_ANY;
sendto(s, this->serverName.c_str(), this->serverName.length() + 1, NULL, (SOCKADDR*)&addr, sizeof(addr));

memset(&addr, NULL, sizeof(addr));

recvfrom(s, buff, BUFF_SIZE, NULL, (SOCKADDR*)&addr, &length);

I need to implement following behavior: when server starts, it should check for existing servers using broadcast. Then it waits for answer.

But, how to set any timeout for waiting?

int optval = 1;
char buff[BUFF_SIZE];
SOCKADDR_IN addr;
int length = sizeof(addr);

if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&optval, sizeof(optval)) == SOCKET_ERROR) throw(errors::SETSOCKOPT);

addr->sin_family = AF_INET;
addr->sin_port = htons(this->serverPort);
addr->sin_addr.s_addr = INADDR_ANY;
sendto(s, this->serverName.c_str(), this->serverName.length() + 1, NULL, (SOCKADDR*)&addr, sizeof(addr));

memset(&addr, NULL, sizeof(addr));

recvfrom(s, buff, BUFF_SIZE, NULL, (SOCKADDR*)&addr, &length);

原文:https://stackoverflow.com/questions/39840877
更新时间:2021-11-18 19:11

最满意答案

使用setsockopt()EAGAIN/EWOULDBLOCK设置读取超时,并处理触发超时时发生的EAGAIN/EWOULDBLOCK


Set a read timeout with setsockopt() and SO_RCVTIMEO, and handle EAGAIN/EWOULDBLOCK which occurs if the timeout is triggered.

相关问答

更多
  • UDP不保证收到的数据包排序,所以基本上,你recvfrom()的第一个数据包可能是你发送的第一个数据包,但绝不能 - 这就是TCP的用途(这保证了接收数据的排序)。 如果它们在传输过程中丢失,您可能根本不会收到部分数据包(或任何数据包)。 对于第二部分:通常,操作系统将为您缓冲一定数量的数据包,这取决于为UDP套接字设置的套接字缓冲区 - 缓冲区特定于每个套接字,而不是它们之间共享。 在Windows上,我不知道如何获得缓冲区的大小,在Linux上,请查看“/ proc / sys / net / ipv ...
  • UDP数据报总是作为一个完整的原子单元传播。 如果您发送12072个UDP数据报,您的接收器将完全收到一个12072数据报或根本没有任何数据报 - 您将永远不会收到部分消息(*)或多个消息连接在一起。 请注意,对于这种大小的数据报,它们几乎肯定在IP层被分割,因为它们可能大于网络的MTU(最大传输单位)。 在这种情况下,如果沿途或接收主机丢弃任何一个分段或发现其中一个分段被损坏,则整个UDP数据报将被丢弃。 (*如果提供给recvfrom的缓冲区太小,则消息可能会被截断,但如果整个消息无法在内核中重新组装, ...
  • mesg[n] = 0; is wrong 如果recvfrom返回1024,那么你的内容索引到你应该的内存之外。 如果recvfrom返回-1,则相同。 确保你处理这两种情况。 您需要确保sockfd实际上具有正确的套接字值,syslog也会打开一个套接字,如果您在某处有某些错误并开始从该文件描述符读取,则会发生奇怪的事情。 mesg[n] = 0; is wrong If recvfrom returns 1024, your're indexing into memory outside what ...
  • 在程序中添加以下函数并使用它而不是直接使用recvfrom函数。 以下functiong具有相同的recvfrom函数输入参数+最后一个超时输入参数 #include #include #include #include #include #include int timeout_recvfrom (int sock, char *buf, int ...
  • 如果使用pthread_kill向线程发送信号, recvfrom()应该返回-1,并将errno设置为EINTR - 然后您可以检查“应用程序现在正在退出”状态,并优雅地完成。 If you use pthread_kill to send a signal to the thread, recvfrom() should return -1 with errno set to EINTR - you can then check for the "application is now exiting" ...
  • 使用setsockopt()和EAGAIN/EWOULDBLOCK设置读取超时,并处理触发超时时发生的EAGAIN/EWOULDBLOCK 。 Set a read timeout with setsockopt() and SO_RCVTIMEO, and handle EAGAIN/EWOULDBLOCK which occurs if the timeout is triggered.
  • 最可能的解释是数据包被丢弃在某条线上。 Wireshark只是告诉你数据包在线上,而不是接收器正确接收它们。 尝试检查接收器上的SO_RCVBUF套接字选项,以确保没有溢出(这将导致丢包),以及检查网络驱动程序是否有任何错误或其他问题的迹象。 The most likely explanation is that the packets are being dropped somewhere along the line. Wireshark just tells you that the packets ...
  • 互联网号码分配机构(IANA)为私有网络保留了以下三个IP地址空间块: 10.0.0.0 - 10.255.255.255 172.16.0.0 - 172.31.255.255 192.168.0.0 - 192.168.255.255 172.17.0.2是专用网络中的地址。 我猜你的机器在这个网络内,还有服务器。 getaddrinfo()可以返回多个地址。 尝试运行所有响应并检查是否还有Inte ...
  • C函数是否被recvfrom和sendto互斥? 不可以。它们可以同时由不同的线程执行。 sendto()不等待recvfrom()读取数据。 它会将数据放入套接字的缓冲区并返回。 多个sendto()可以阻止先前的sendto()完成。 如果在发送时发生任何错误(缓冲区已满,消息太大等),则可以检查检查errno以检查失败原因。 基本上,您不需要在两个线程的sendto()和recvfrom()调用之间进行任何同步; 它们是原子操作。 Are the C functions recvfrom and se ...
  • recvfrom()的文档非常清楚导致10014(WSAEFAULT)的原因: WSAEFAULT buf或参数buf不在用户地址空间中 ,或者fromlen参数太小而无法容纳对等地址的源地址。 您将字符串文字分配给传递给recvfrom()的buffer : buffer="WSAStartup was suuccessful\n"; 字符串文字驻留在recvfrom()无法写入的只读内存中。 此外, buffer被声明为char* ,因此使用sizeof(buffer)是错误的。 你需要为buffer ...

相关文章

更多

最新问答

更多
  • 如何从rails插件加载javascript文件(How to load javascript file from rails plugin)
  • 我正在研究有向图的DFS,如何到达没有任何边缘指向的节点?(I'm working on a DFS of a directed graph, How do I get to a node without any edges pointed at it?)
  • 无法在swift中展开可选项(can't unwrap optional in swift)
  • 如何从熊猫中提取列表?(How to extract a list from pandas?)
  • 计算不同列中2个值的出现次数(Count number of occurrences of 2 values in different columns)
  • Stack ExtJS 6 + Spring Boot(Stack ExtJS 6 + Spring Boot)
  • 如何安装ioreg?(How to install ioreg?)
  • Chrome Packaged app webview中的重音字符未显示(Accented characters in Chrome Packaged app webview not showing up)
  • C ++ recvfrom超时(C++ recvfrom timeout)
  • 如何使用实体框架(.edmx模型)和Razor视图为MVC4或MVC 5创建部分视图?(How can i create a Partial View for MVC4 or MVC 5 using Entity Framework (.edmx Model) with Razor Views?)
  • 子类QStyledItemDelegate忽略样式表(Subclassed QStyledItemDelegate ignores Stylesheet)
  • 有没有办法以编程方式配置ios应用程序的通知显示设置?(Is there a way to programmatically configure the notification display setting for an ios app?)
  • boost asio serial_port_service和serial_port有什么区别(What is the difference of boost asio serial_port_service and serial_port)
  • 如何通过解析nginx日志文件自动拒绝IP地址(How to deny ip address automatically by parsing nginx log file)
  • 如何在C#中为ASCII 127定义字符或字符串常量?(How might I define a character or string constant in C# for ASCII 127?)
  • 如何获得R中两个集合的差异?(How to get the differences of two set in R?)
  • 如何通过IMG-Activity找到定制路径(How to find the Customizing Path via IMG-Activity)
  • 可以用python窗口打开.py文件么
  • 指针的增量是否与整数的增量相同?(Does increment in pointer not same as that of integer? [closed])
  • 我无法删除使用Delphi7处于关系中的数据库的2个表中的所有数据(I can't delete all the data within 2 tables of a database which is in a relationship using Delphi7)
  • 使用反射向ArrayList添加未知类的对象(Add an object of unknown class to ArrayList with reflection)
  • 我想学JAVA 推荐下怎么 学
  • 什么是ASP.NET Identity的IUserSecurityStampStore 接口?(What is ASP.NET Identity's IUserSecurityStampStore interface?)
  • jquery如何获取多个同id的div,然后修改css属性左边间距left的值
  • jquery ui resizable:调整旋转对象的大小(jquery ui resizable: resizing the rotated objects)
  • 如何用sublime text编写微信小程序代码
  • Hibernate:在一个数据库表行中存储一个固定长度的数组(Hibernate: Storing an fixed length array in one database table row)
  • shared_ptr用于原始指针参数(shared_ptr for a raw pointer argument)
  • 将本地git分支与远程分支进行比较?(How to compare a local git branch with its remote branch?)
  • 如何在DOM中查找字符串并通过php或jQuery更改它们(how to find strings in DOM and change them by php or jQuery)