tcp大文件传输,全部write成功,read接收到部分后阻塞

returningprodigal 2018-01-06 12:44:51
tcp大文件传输,全部write成功,read接收到部分后阻塞。
小文件传输没问题。
...全文
820 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mLee79 2018-01-08
  • 打赏
  • 举报
回复
你 write 都没检查人发送了几个字节, 这能不出错么, 发送的字节数是有可能小于你需要发送的 ...
赵4老师 2018-01-08
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
自信男孩 2018-01-06
  • 打赏
  • 举报
回复
引用 4 楼 qq_21767819 的回复:
试试在结构体加个字符缩进,保持一个字节对齐,然后试试把整形的转化为网络序试试
小文件传输没问题,那么应该跟你提出的这个可能没关系。
qq_21767819 2018-01-06
  • 打赏
  • 举报
回复
试试在结构体加个字符缩进,保持一个字节对齐,然后试试把整形的转化为网络序试试
自信男孩 2018-01-06
  • 打赏
  • 举报
回复
引用 2 楼 ReturningProdigal 的回复:
[quote=引用 1 楼 cfjtaishan 的回复:] 贴出你的代码,如果小文件没问题,那么建议在write端加一些延迟,每次发完一个包之后,都加一些延迟。怀疑是接收端没有来得及接收,导致部分数据丢失。加延迟是保证read端都能将每个网络包接收到。当然,加延迟会导致发送文件时间边长,另一种办法就是read端用环形缓冲区接收。

//传输数据结构体
typedef struct ResponeBody{
	int packindex;//4 byte
	char type;//2 byte
	char status;//2 byte
	int datalen;//4 byte
	int datatotal;//4 byte
	char s_arg[24];//24 byte
	char data[SIZE_DATA];
}ResponeBody;

//发送端
while((num = read(fd, resp.data, SIZE_DATA)) > 0)
{
	resp.type = getData;
	resp.status = 1;
	resp.datalen = num;
	res = my_write(socket, &resp, SIZE_RESP);
	if(res < 0){
		return -1;
	}
	memset(&resp, 0, SIZE_RESP);
}
close(fd);

//读取数据
int ret = -1;
while(1){
	num = read(socket, &resp, SIZE_RESP);
	if(num <= 0 || len_recv >= datatotal){
		printf("get success\n");
		ret = 0;
		break;
	}
	if(0 == resp.status || resp.type != getData){
		ret = -1;
		break;
	}
	write(fd, resp.data, resp.datalen);
	len_recv += num-SIZE_INFO;
	printf("get ----[%2.2f%%]----\n", len_recv/(double)datatotal * 100);
	memset(&resp, 0, SIZE_RESP);
}
[/quote] 怀疑是读取端没有即使将数据接收,导致数据包丢失。
returningprodigal 2018-01-06
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
贴出你的代码,如果小文件没问题,那么建议在write端加一些延迟,每次发完一个包之后,都加一些延迟。怀疑是接收端没有来得及接收,导致部分数据丢失。加延迟是保证read端都能将每个网络包接收到。当然,加延迟会导致发送文件时间边长,另一种办法就是read端用环形缓冲区接收。

//传输数据结构体
typedef struct ResponeBody{
	int packindex;//4 byte
	char type;//2 byte
	char status;//2 byte
	int datalen;//4 byte
	int datatotal;//4 byte
	char s_arg[24];//24 byte
	char data[SIZE_DATA];
}ResponeBody;

//发送端
while((num = read(fd, resp.data, SIZE_DATA)) > 0)
{
	resp.type = getData;
	resp.status = 1;
	resp.datalen = num;
	res = my_write(socket, &resp, SIZE_RESP);
	if(res < 0){
		return -1;
	}
	memset(&resp, 0, SIZE_RESP);
}
close(fd);

//读取数据
int ret = -1;
while(1){
	num = read(socket, &resp, SIZE_RESP);
	if(num <= 0 || len_recv >= datatotal){
		printf("get success\n");
		ret = 0;
		break;
	}
	if(0 == resp.status || resp.type != getData){
		ret = -1;
		break;
	}
	write(fd, resp.data, resp.datalen);
	len_recv += num-SIZE_INFO;
	printf("get ----[%2.2f%%]----\n", len_recv/(double)datatotal * 100);
	memset(&resp, 0, SIZE_RESP);
}
自信男孩 2018-01-06
  • 打赏
  • 举报
回复
贴出你的代码,如果小文件没问题,那么建议在write端加一些延迟,每次发完一个包之后,都加一些延迟。怀疑是接收端没有来得及接收,导致部分数据丢失。加延迟是保证read端都能将每个网络包接收到。当然,加延迟会导致发送文件时间边长,另一种办法就是read端用环形缓冲区接收。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧