C++ UDP通信,recvfrom函数一直堵塞
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函数一直堵塞相关推荐
- python recvfrom函数详解_recvfrom函数详解
int ret; srtuct sockaddr_in from; ret=revcfrom(sock,recvbuf,BUFSIZErecvfrom函数用于从(已连接)套接口上接收数据,并捕获数据发 ...
- 2-3:套接字(Socket)编程之UDP通信,sockaddr,sockaddr_in,recvfrom,sendto
文章目录 一:回顾 二:彻底了解套接字和struct socket结构 (1)一切皆文件-文件描述符-套接字描述符 (2)struct socket结构 A:struct socket结构体作用 B: ...
- Qt使用UDp通信、套接字socket的成员函数bind()的作用
一. 所谓bind,就是指绑定本地接受端口. 指定ip,是为了分辨多ip主机.在有服务端和客户端的UDP中,bind是服务端调用的函数,绑定的是服务端的IP,假设服务端有多个网卡,即 ...
- 【博客282】udp socket的recvfrom函数的一个易错问题
内容: 当使用udp socket的recvfrom函数的时候,如果指定缓冲区大小不够会怎么样 问题: 当recvfrom接收udp socket的数据的时候,如果你用来接收的缓冲区太小,那么会出现让 ...
- MFC/UDP通信函数详细解说
原文见: UDP通信
- C语言网络编程:UDP通信实现
文章目录 UDP的特点: UDP的用途 UDP编程模型 UDP通信代码实现 UDP的特点: udp 协议是一种无链接的不可靠传输协议,且UDP每次发送到分组数据大小都是固定的,它的主要特点如下: 不建 ...
- [python学习] 专题七.网络编程之套接字Socket、TCP和UDP通信实例
很早以前研究过C#和C++的网络通信,参考我的文章: C#网络编程之Tcp实现客户端和服务器聊天 C#网络编程之套接字编程基础知识 ...
- 1.6 网络编程之 UDP通信
************************************************** * 本文由小鸟飞飞整理发表 <samboy@sohu.com> * * 首发网站:蓝丽 ...
- [C语言]一个很实用的服务端和客户端进行UDP通信的实例
前段时间发了个TCP通信的例子,现在再来一个UDP通信的例子.这些可以作为样本程序,用到开发中."裸写"socket老是记不住步骤,经常被鄙视-- 下面的例子很简单,写一个UDP的 ...
最新文章
- 如何调整金格电子章服务器印章_大型集团公司的印章管理方法
- 开源:ASP.NET MVC+EF6+Bootstrap开发框架
- LeetCode Single Number III(位操作)
- Python列表的常用方法
- Docker 实战教程之从入门到提高 (四)
- ioc spring 上机案例_抛开Spring去理解IOC思想 - 原来IOC容器这么简单
- DNN2(DotNetNuke2.0)的一些资源
- springboot 初始化一个常量map_C++ 惯用法: const 常量和字面量
- 阐述游戏关卡设计中的色彩理论
- 关于平面设计知识,设计师需要懂得印刷常识——黎乙丙
- Unable to find gradle task to build
- 华为S5700交换机通过命令开启snmp功能
- ear的英语怎么念_鸡娃英语的你,需要翻越三座大山
- 在Unity实现Canny边缘检测
- matlab抢占时隙算法,ALOHA anti-collision、二进制数搜索算法以及帧时隙算法
- 数据结构课程设计(四):行车路线问题(C++、图、迪杰斯特拉算法、最短路径)
- C语言--使用指针实现删除字符串中的空格
- 持续交付的发展与持续交付中的测试
- qq空间java_Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据流程分析...
- 当人工智能遇上计算社会科学……