内容: 当使用udp socket的recvfrom函数的时候,如果指定缓冲区大小不够会怎么样

问题:

当recvfrom接收udp socket的数据的时候,如果你用来接收的缓冲区太小,那么会出现让你
惊讶的情况

服务端实例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>int main()
{struct sockaddr_in srvAddr;bzero(&srvAddr,sizeof(srvAddr));srvAddr.sin_family = AF_INET;srvAddr.sin_addr.s_addr = htonl(INADDR_ANY);srvAddr.sin_port = htons(8888);int srvAddrLen = sizeof(srvAddr);int fd = socket(AF_INET, SOCK_DGRAM, 0);bind(fd, (struct sockaddr *)&srvAddr, sizeof(srvAddr));while(1){char buff[6] = {0};int ret = recvfrom(fd, buff, sizeof(buff) - 1, 0, (struct sockaddr *)&srvAddr, (socklen_t*)&srvAddrLen);printf("msg from client : %s,the length is %d\n", buff, ret);}close(fd);return 0;
}

客户端实例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>int main()
{struct sockaddr_in srvAddr;bzero(&srvAddr, sizeof(srvAddr));srvAddr.sin_family = AF_INET;srvAddr.sin_addr.s_addr = inet_addr("127.0.0.1");srvAddr.sin_port = htons(8888);int fd = socket(AF_INET, SOCK_DGRAM, 0);while(1){printf("press any key to send data\n");getchar();char buff[128] = {0};snprintf(buff, sizeof(buff), "hello world");printf("send size is %d\n", strlen(buff));sendto(fd, buff, strlen(buff), 0, (struct sockaddr *)&srvAddr, sizeof(srvAddr));}close(fd);return 0;
}

服务端运行结果:

luzejia@ubuntu:~$ gcc server.c -o server
luzejia@ubuntu:~$ ./server
msg from client : hello,the length is 5
msg from client : hello,the length is 5
msg from client : hello,the length is 5
msg from client : hello,the length is 5
msg from client : hello,the length is 5
msg from client : hello,the length is 5
msg from client : hello,the length is 5
msg from client : hello,the length is 5
msg from client : hello,the length is 5
msg from client : hello,the length is 5

客户端运行结果:

luzejia@ubuntu:~$ ./client
press any key to send datasend size is 11
press any key to send datasend size is 11
press any key to send datasend size is 11
press any key to send datasend size is 11
press any key to send datasend size is 11
press any key to send datasend size is 11
press any key to send datasend size is 11
press any key to send datasend size is 11
press any key to send datasend size is 11
press any key to send datasend size is 11
press any key to send data

结果解析:

1、udp的数据报传输方式是数据报,不是数据流,不存在粘包,拆包问题,但是发几次就需要几次来收2、如果收包长度不过,多的会被丢弃,而不会在下次recvfrom的时候取到3、在使用udp socket编程的时候,如果buffer太小,出现接收不完整的错误也不会返回错误给你4、若出现没有办法一次性读走所有内容,就只读缓冲区能存的,但是读到用户缓冲区,内核的缓冲区中的内容是一直存在的,因此运行结果会出现根本没读后面的world单词,后续继续读也不会读到剩余的world。

【博客282】udp socket的recvfrom函数的一个易错问题相关推荐

  1. Django 3.2.5博客开发教程:URL与视图函数

    在讲URL与视图函数之前我们先给大家简单介绍一下用户访问网站的流程.我们访问一个网站的时候,一般先打开浏览器,然后在浏览器的地址栏里输入一个网址,也就是URL,然后回车,我们就可以在浏览器里看到这个网 ...

  2. CSDN:2019年度CSDN博客之星评选竞赛——105号【一个处女座的程序猿】,感谢您,投上的宝贵一票,感谢!感恩!

    CSDN:2019年度CSDN博客之星评选竞赛--105号[一个处女座的程序猿],感谢您,投上的宝贵一票,感谢!感恩! 导读:新的一年,改革春风吹满地,新的一年要争气!  博主在此,祝所有朋友们,20 ...

  3. mybatis一个怪异的问题: Invalid bound statement not found 作者及来源: babyblue - 博客园 收藏到→_→: 摘要: mybatis一个怪异

    mybatis一个怪异的问题: Invalid bound statement not found 作者及来源: babyblue - 博客园    收藏到→_→: 摘要: mybatis一个怪异的问 ...

  4. C++ UDP通信,recvfrom函数一直堵塞

    1. 问题描述 UDP通信中,接收端调用recvfrom函数一直阻塞,不返回任何消息 2. 错误示例 发送端代码: #include <stdio.h> #include <stri ...

  5. uni-app 结合云函数开发小程序博客(二):云函数实现登录注册

    我们研发开源了一款基于 Git 进行技术实战教程写作的工具,我们图雀社区的所有教程都是用这款工具写作而成,欢迎 Star 哦 如果你想快速了解如何使用,欢迎阅读我们的 教程文档哦 本文由图雀社区认证作 ...

  6. 感谢博客园*暮夏*的系列文章--PHP一个重要的学习工具

    最近发的几篇文章均来自他的博客 没有经过他的同意 但是我在文章下面都标名了出处 如果有问题 还请及时与我联系. 这里再转载一篇他对PHP的看法的文章: php--一个重要的学习工具 在大学里面,计算机 ...

  7. 2018.7.10 个人博客文章=利用ORM创建分类和ORM的内置函数

    昨天的注册收尾工作 其实就差了和MySql联系起来的部分,这部分很简单,首先要做的就是保存用户通过from传送过来的头像文件: """ 保存头像文件 "&quo ...

  8. Android经典的大牛博客推荐

    Android中文Wiki AndroidStudio-NDK开发-移动开发团队 谦虚的天下 – 博客园 gundumw100博客 – android进阶分类文章列表 – ITeye技术网站 CSDN ...

  9. 我的Android进阶之旅:经典的大牛博客推荐

    Android中文Wiki AndroidStudio-NDK开发-移动开发团队 谦虚的天下 - 博客园 gundumw100博客 - android进阶分类文章列表 - ITeye技术网站 CSDN ...

最新文章

  1. 如何在多Node版本的情况下公用一个npm
  2. Java数据结构类如何使用_Matlab如何使用Java的数据结构类型
  3. 【python】数据结构与算法之选择排序
  4. CoolQ/DingTalk 实现CI/CD消息推送到群
  5. docker专题(2):docker常用管理命令(下)
  6. 计算机软考论文网络真题,软考历年真题在线测试系统测试与开发
  7. 世界首个体细胞克隆猴在中国诞生;马云在达沃斯变魔术;阿里通信回应工信部约谈丨价值早报
  8. 2019-CS224n-Assignment3
  9. emmagee测试汇总
  10. stata面板数据gmm回归_stata面板数据回归操作之GMM
  11. 三维地质建模数据处理
  12. 阿里数据港张北数据中心项目本月底运营
  13. 阿尔弗雷德.爱因斯坦论莫扎特钢协
  14. Springboot餐饮点餐系统毕业设计源码301749
  15. 计算机组成原理 光盘中试题答案,白中英计算机组成原理光盘上试题及答案.doc...
  16. java毕业设计基于spring框架的论坛网站项目设计和源码
  17. Python-接口自动化流程(pytest)
  18. log4j-slf4j-impl cannot be present with log4j-to-slf4j
  19. CleanMyMac4.12最新Mac电脑系统垃圾清理神器
  20. 异地分居几乎没有夫妻生活,通过调查取证发现妻子有出轨情况怎么办?-CSDN论坛-CSDN.NET-中国最大的IT技术社区

热门文章

  1. gitlab删除项目
  2. web存储详解(cookie、sessionStorage、localStorage、indexedDB)
  3. 滤波融合(二)基于C++完成一个简单的 扩展卡尔曼滤波器的非线性系统模型
  4. Visio 保存卡死解决办法
  5. 假使世界原来不像你预期,也要做最好的你
  6. 拼多多2020学霸批数据分析师笔试题 (2019.7.28)
  7. 开学季实惠好用电容笔有哪些?推荐平价好用的电容笔
  8. ADSP21489的算法调用基础
  9. SAP HCM payroll schema
  10. matlab中高频变压器怎么找,干货|手把手教你绕制高频变压器