1. 问题描述

UDP通信中,接收端调用recvfrom函数一直阻塞,不返回任何消息

2. 错误示例

发送端代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <iostream>
using namespace std;int main() {int port = 8000;int sockfd;sockaddr_in addr;char send_buf[] = "i am send.";int send_num = 0;sockfd = socket(AF_INET, SOCK_DGRAM, 0);memset(&addr, 0, sizeof(addr));addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr("127.0.0.1");while (1) {sleep(1);send_num = sendto(sockfd, (char*)send_buf, (size_t) sizeof(send_buf), 0, (struct sockaddr *)&addr, (socklen_t)sizeof(addr));cout<<"send bytes: "<<send_num<<"   send messages: "<<send_buf<<endl;}
}

接收端代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <iostream>
using namespace std;int main() {int port = 8000;int sockfd;sockaddr_in addr;char recv_buf[11];int recv_num = 0;sockfd = socket(AF_INET, SOCK_DGRAM, 0);memset(&addr, 0, sizeof(addr));addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr("127.0.0.1");socklen_t addr_len = sizeof(addr);cout<<"ready to receive message."<<endl;while (1) {recv_num = recvfrom(sockfd, (char*) recv_buf, 11, 0, (struct sockaddr *)&addr, &addr_len);cout<<recv_num<<endl;}
}

3. 原因及修改

recvfrom函数默认使用的是阻塞模式,即一直等待消息到来,如果能确定发送端没有问题,那么问题就出在了接收端。

可以先设置一下等待时间看一下,添加在while(1)前边即可。

    tv_out.tv_sec=1;//等待1秒tv_out.tv_usec=0;if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv_out, sizeof(tv_out)) < 0)


发现recvfrom函数一直返回-1,也就是压根没有收不到消息,后来查资料才发现,是因为接收端的套接字bind,没有与sockaddr_in绑定,绑定之后即可正常接收了。

    if (bind(sockfd, (sockaddr*)&addr, sizeof(addr))<0){cout<<"bind failed"<<endl;;}

UDP通信中发送端不需要bind,而接收端需要bind,这与TCP通信正好是相反的。

4. 总结

对于recvfrom函数堵塞,可以设置一下等待时间,然后继续排查。
具体的排查过程:

1. 检查发送端是否发送成功,即sendto函数是否正常返回发送字节数;
2. 检查接收端的IP 端口是否与发送端一致;
3. 检查接收端是否bind成功。

C++ UDP通信,recvfrom函数一直堵塞相关推荐

  1. python recvfrom函数详解_recvfrom函数详解

    int ret; srtuct sockaddr_in from; ret=revcfrom(sock,recvbuf,BUFSIZErecvfrom函数用于从(已连接)套接口上接收数据,并捕获数据发 ...

  2. 2-3:套接字(Socket)编程之UDP通信,sockaddr,sockaddr_in,recvfrom,sendto

    文章目录 一:回顾 二:彻底了解套接字和struct socket结构 (1)一切皆文件-文件描述符-套接字描述符 (2)struct socket结构 A:struct socket结构体作用 B: ...

  3. Qt使用UDp通信、套接字socket的成员函数bind()的作用

    一. 所谓bind,就是指绑定本地接受端口.          指定ip,是为了分辨多ip主机.在有服务端和客户端的UDP中,bind是服务端调用的函数,绑定的是服务端的IP,假设服务端有多个网卡,即 ...

  4. 【博客282】udp socket的recvfrom函数的一个易错问题

    内容: 当使用udp socket的recvfrom函数的时候,如果指定缓冲区大小不够会怎么样 问题: 当recvfrom接收udp socket的数据的时候,如果你用来接收的缓冲区太小,那么会出现让 ...

  5. MFC/UDP通信函数详细解说

    原文见: UDP通信

  6. C语言网络编程:UDP通信实现

    文章目录 UDP的特点: UDP的用途 UDP编程模型 UDP通信代码实现 UDP的特点: udp 协议是一种无链接的不可靠传输协议,且UDP每次发送到分组数据大小都是固定的,它的主要特点如下: 不建 ...

  7. [python学习] 专题七.网络编程之套接字Socket、TCP和UDP通信实例

    很早以前研究过C#和C++的网络通信,参考我的文章:                  C#网络编程之Tcp实现客户端和服务器聊天                 C#网络编程之套接字编程基础知识   ...

  8. 1.6 网络编程之 UDP通信

    ************************************************** * 本文由小鸟飞飞整理发表 <samboy@sohu.com> * * 首发网站:蓝丽 ...

  9. [C语言]一个很实用的服务端和客户端进行UDP通信的实例

    前段时间发了个TCP通信的例子,现在再来一个UDP通信的例子.这些可以作为样本程序,用到开发中."裸写"socket老是记不住步骤,经常被鄙视-- 下面的例子很简单,写一个UDP的 ...

最新文章

  1. 如何调整金格电子章服务器印章_大型集团公司的印章管理方法
  2. 开源:ASP.NET MVC+EF6+Bootstrap开发框架
  3. LeetCode Single Number III(位操作)
  4. Python列表的常用方法
  5. Docker 实战教程之从入门到提高 (四)
  6. ioc spring 上机案例_抛开Spring去理解IOC思想 - 原来IOC容器这么简单
  7. DNN2(DotNetNuke2.0)的一些资源
  8. springboot 初始化一个常量map_C++ 惯用法: const 常量和字面量
  9. 阐述游戏关卡设计中的色彩理论
  10. 关于平面设计知识,设计师需要懂得印刷常识——黎乙丙
  11. Unable to find gradle task to build
  12. 华为S5700交换机通过命令开启snmp功能
  13. ear的英语怎么念_鸡娃英语的你,需要翻越三座大山
  14. 在Unity实现Canny边缘检测
  15. matlab抢占时隙算法,ALOHA anti-collision、二进制数搜索算法以及帧时隙算法
  16. 数据结构课程设计(四):行车路线问题(C++、图、迪杰斯特拉算法、最短路径)
  17. C语言--使用指针实现删除字符串中的空格
  18. 持续交付的发展与持续交付中的测试
  19. qq空间java_Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据流程分析...
  20. 当人工智能遇上计算社会科学……

热门文章

  1. 【presto】时间函数汇总
  2. 城乡数字包容性发展的实现路径
  3. イルルゥ / 伊露露
  4. Adobe发布AI智能生成图像新工具,助力Adobe国际认证再添就业利器
  5. Imaris中文使用教程下载
  6. docker配置ca证书
  7. Python连接mysql,插入数据时不报错,但是没有插入进去
  8. 检讨/情况说明的写法
  9. 游承超:钢化玻璃膜和普通膜有什么不一样呢?(2P)
  10. 计算机RAM和ROM