基于c语言的socket乱码解决

在C语言中使用socket进行文件传输时遇到问题,server无法正确接收并保存文件。原因在于send和recv的buf_size不匹配,导致数据接收混乱。通过调整客户端发送文件名的方式,改为发送文件名的长度,解决了文件名接收错误的问题,使得server能正确接收到文件名并生成文件。
摘要由CSDN通过智能技术生成

近日在用c语言学习socket,发现这个问题。
主要功能:client读取本地文件,发送文件名,发送文件;
server得到文件名,写入到本地。
client部分代码如下:

send(sockfd, filename, strlen(filename), 0);

server这样接收:

if (recv(accept_fd, filename, sizeof(filename), 0) <= 0)
{
perror(“recv fail”);
close(accept_fd);
}

运行发现,server本地没发现文件生成,ls查看产生了一个???文件
怀疑是文件名发送错误,在client和server都打印了文件名,client显示正常,server显示错误。
在网上找解决方法,在https://bbs.csdn.net/topics/380164146中发现,粘贴如下:

ACE::recv(handlers, buffer, size),服务端连续不断的发送数据来(数据长度可能不等),每次不等数据接收完后面的数据就会压进来,而recv每次都会copy buffer大小的数据,造成buffer里是上个没收完的数据和这个数据
比如每次发送500个字节,接收buffer为1024,发送5次,按理应该接到的大小是这样:
500
500
500
500
500
但是实际是这样:
1024
1024
452

如果数据大于buffer,比如1030,应该是:
1024
6
1024
6
1024
6
1024
6
1024
6
但是实际会是这样:
1024
1024
1024
1024
1024
30

就是说send()和recv()的buf_size一定要匹配才行。常见的做法是每次发送在前面添加固定的size表示字节数,recv()时只接收这部分。
后client改为这样就正常了。

send(sockfd, filename, sizeof(filename), 0);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值