记一次UDP的sendto函数错误解决
错误现象
在编写使用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函数错误解决相关推荐
- 测试socket udp 单次传输数据上限(sendto()函数data不能超过65507字节。udp头占8字节,ip头占20字节,加起来正好65535字节)
网传udp传输单次sendto()数据需小于64kb,即65536个字节? 于是我想实测一番 发送端 测试结果: 单次传输65507字节正常: 超过65507字节报错: 接收端 接收端只要大于等于发送 ...
- 从send函数和sendto函数参数的不同看TCP和UDP的差别
ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t sendto(int sockfd, const v ...
- 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 ...
- c语言 socket send,C语言中send()函数和sendto()函数的使用方法
C语言send()函数:经socket传送数据头文件: #include #include 定义函数: int send(int s, const void * msg, int len, unsig ...
- socket网络编程-socket()、bind()、setsockopt()、recvfrom()、sendto()函数
socket()函数 socket()函数的原型如下,这个函数建立一个协议族为domain.协议类型为type.协议编号为protocol的套接字文件描述符.如果函数调用成功,会返回一个标识这个套 ...
- UDP协议 sendto 和 recvfrom 浅析与示例
图片/在思考的樱木花道 UDP(user datagram protocol)用户数据报协议,属于传输层. UDP是面向非连接的协议,它不与对方建立连接,而是直接把数据报发给对方.UDP无需建立类如三 ...
- c语言 lookup函数怎么用_菜鸟记502用lookup和vlookup函数核对数据的一个小栗子
欢迎转发扩散点在看 万一您身边的朋友用得着呢? 各位朋友早上好,小菜继续和您分享经验之谈,截止今日小菜已分享400+篇经验之谈,可以文章编号或关键词进行搜索. 微信推送规则发生改变,如果您想看到小菜每 ...
- UDP调用connect函数
UDP是无连接的,在发送数据时需要指定对端的IP地址和端口,每次发送数据需要重新连接(多次发数据导致效率低下),而且异步错误不会返回到UDP套接字.这些在UDP调用connect函数之后都发生了改变. ...
- linux内核sock_sendmsg,为什么linux中sendto函数中的msg.msg_iovlen=1;
为什么linux中sendto函数中的msg.msg_iovlen=1; | 内核中定义的sys_sendto的源码吗? 这个属于sendmsg中struct msghdr的用法问题, sys_sen ...
- tp5 php7 报500,记一次TP单元测试报500错误的问题
记一次TP单元测试报500错误的问题 一直听说好的单元测试能提高代码质量,昨天终于在下定决心弄懂单元测试,但第一步就把我干趴下了,我的问题在下面 开始都没有什么问题,tp5单元测试的手册就那一点,通过 ...
最新文章
- linux shell trap捕捉信号 附信号表 SIGTERM SIGKILL
- jQuery 3.1.1 官方下载地址
- python读取html文件中的表格数据_Python 读取各类文件格式的文本信息 | doc,excel,html,mht...
- 寻java、.net、或C#兼职程序开发人员(上海)
- ubuntu shortcuts
- 手机输入法并一不一定要横向充满
- 数维杯国际大学生数学建模挑战赛
- TF-IDF来源及理论推导 熵推导出
- AUTOCAD——计算面积的方法
- wps插入公式与文字不平行问题解决办法
- 网易评论真搞笑~~~呵呵
- 二维码学习笔记(一) | 二维码概述
- 推荐一个 Github 上最全的C语言教学
- ssm中小企业仓库管理信息系统的开发与实现毕业设计源码150916
- c语言如何用fscanf将字符串读取,fscanf如何使用C语言处理%c和%s
- WebView部分源码概览
- 通过python的requests库和socks代理调用接口API(接码平台)
- asp.net 引入html文件路径问题,asp.net 网站获取一个文件或文件夹的绝对路径,使用方法Server.MapPath(项目根目下虚拟文件路径)实现...
- C# DES加密解密算法
- CSS样式书写顺序 与 浏览器内部加载原理