错误现象

在编写使用select函数的TCP和UDP回射程序,出现UDP的sendto错误,现象如下:

  • 服务端正常启动后,调用select函数监听TCP和UDP套接字, 可以正常处理TCP请求。

  • UDP客户端可以连接到服务端,但接收标准输入后无回显,阻塞于recvfrom。

解决过程

经排查,发现服务端处理UDP请求的代码有问题,如下:

typedef struct sockaddr SA;
void udp_echo(int udpfd) {int n;char recvline[MAXLINE];struct sockaddr_in cliaddr;socklen_t len;n = recvfrom(udpfd, recvline, MAXLINE, 0, (SA*)&cliaddr, &len);sendto(udpfd, recvline, n, 0, (SA*)&cliaddr, len);
}

udp_echo函数,先用recvfrom读取UDP客户端发送的字符串,再使用sendto将该字符串送回客户端。代码中没有判断recvfrom, sendto函数的返回值,为了获取出错信息改写如下:

void udp_echo(int udpfd) {int n;char recvline[MAXLINE];struct sockaddr_in cliaddr;socklen_t len;if((n = recvfrom(udpfd, recvline, MAXLINE, 0, (SA*)&cliaddr, &len)) < 0) {err_sys("recvfrom error");}if(sendto(udpfd, recvline, n, 0, (SA*)&cliaddr, len) != n) {printf("error: %s\n", strerror(errno));err_sys("sendto error");}
}

再运行程序,输出如下:

$ error: Invalid argument

$ sendto error

错误原因在于cliaddr参数没有初始化。sockaddr_in结构体在使用之前,需要先使用bzero/memset函数初始化为0,否则出现赋值不完整导致参数无效。

总结:

  • 变量使用之前最好初始化。

  • 注意判断函数的返回值,可以使用包裹函数。

记一次UDP的sendto函数错误解决相关推荐

  1. 测试socket udp 单次传输数据上限(sendto()函数data不能超过65507字节。udp头占8字节,ip头占20字节,加起来正好65535字节)

    网传udp传输单次sendto()数据需小于64kb,即65536个字节? 于是我想实测一番 发送端 测试结果: 单次传输65507字节正常: 超过65507字节报错: 接收端 接收端只要大于等于发送 ...

  2. 从send函数和sendto函数参数的不同看TCP和UDP的差别

    ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t sendto(int sockfd, const v ...

  3. socket编程:从send函数和sendto函数参数的不同看TCP和UDP的差别。

    ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t sendto(int sockfd, const v ...

  4. c语言 socket send,C语言中send()函数和sendto()函数的使用方法

    C语言send()函数:经socket传送数据头文件: #include #include 定义函数: int send(int s, const void * msg, int len, unsig ...

  5. socket网络编程-socket()、bind()、setsockopt()、recvfrom()、sendto()函数

    socket()函数 ​ socket()函数的原型如下,这个函数建立一个协议族为domain.协议类型为type.协议编号为protocol的套接字文件描述符.如果函数调用成功,会返回一个标识这个套 ...

  6. UDP协议 sendto 和 recvfrom 浅析与示例

    图片/在思考的樱木花道 UDP(user datagram protocol)用户数据报协议,属于传输层. UDP是面向非连接的协议,它不与对方建立连接,而是直接把数据报发给对方.UDP无需建立类如三 ...

  7. c语言 lookup函数怎么用_菜鸟记502用lookup和vlookup函数核对数据的一个小栗子

    欢迎转发扩散点在看 万一您身边的朋友用得着呢? 各位朋友早上好,小菜继续和您分享经验之谈,截止今日小菜已分享400+篇经验之谈,可以文章编号或关键词进行搜索. 微信推送规则发生改变,如果您想看到小菜每 ...

  8. UDP调用connect函数

    UDP是无连接的,在发送数据时需要指定对端的IP地址和端口,每次发送数据需要重新连接(多次发数据导致效率低下),而且异步错误不会返回到UDP套接字.这些在UDP调用connect函数之后都发生了改变. ...

  9. linux内核sock_sendmsg,为什么linux中sendto函数中的msg.msg_iovlen=1;

    为什么linux中sendto函数中的msg.msg_iovlen=1; | 内核中定义的sys_sendto的源码吗? 这个属于sendmsg中struct msghdr的用法问题, sys_sen ...

  10. tp5 php7 报500,记一次TP单元测试报500错误的问题

    记一次TP单元测试报500错误的问题 一直听说好的单元测试能提高代码质量,昨天终于在下定决心弄懂单元测试,但第一步就把我干趴下了,我的问题在下面 开始都没有什么问题,tp5单元测试的手册就那一点,通过 ...

最新文章

  1. linux shell trap捕捉信号 附信号表 SIGTERM SIGKILL
  2. jQuery 3.1.1 官方下载地址
  3. python读取html文件中的表格数据_Python 读取各类文件格式的文本信息 | doc,excel,html,mht...
  4. 寻java、.net、或C#兼职程序开发人员(上海)
  5. ubuntu shortcuts
  6. 手机输入法并一不一定要横向充满
  7. 数维杯国际大学生数学建模挑战赛
  8. TF-IDF来源及理论推导 熵推导出
  9. AUTOCAD——计算面积的方法
  10. wps插入公式与文字不平行问题解决办法
  11. 网易评论真搞笑~~~呵呵
  12. 二维码学习笔记(一) | 二维码概述
  13. 推荐一个 Github 上最全的C语言教学
  14. ssm中小企业仓库管理信息系统的开发与实现毕业设计源码150916
  15. c语言如何用fscanf将字符串读取,fscanf如何使用C语言处理%c和%s
  16. WebView部分源码概览
  17. 通过python的requests库和socks代理调用接口API(接码平台)
  18. asp.net 引入html文件路径问题,asp.net 网站获取一个文件或文件夹的绝对路径,使用方法Server.MapPath(项目根目下虚拟文件路径)实现...
  19. C# DES加密解密算法
  20. CSS样式书写顺序 与 浏览器内部加载原理

热门文章

  1. 等保二级和等保三级的区别
  2. python环境下,PIP卸载、重装、升级
  3. Python求绝对值的三种方法
  4. tlq_ver.dat文件不存在
  5. ms17010批量扫描备忘
  6. 基于脉动阵列实现矩阵卷积(FPGA)
  7. 深度学习教程(12) | CNN应用:目标检测(吴恩达·完整版)
  8. SU插件情报局 | Selection Toys 过滤选择(附插件安装包)
  9. python如何制作exe文件_Python制作exe文件简单流程
  10. ssd网络结构简单说明