近日在用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);