网络编程初学者,一个小问题怎么解决啊?

ningto.com 2011-09-24 10:26:24
说明:客户端打开一个src.txt文件,将里面的所有内容按每小块1024字节读取,发送给服务器端。
服务器端打开一个空文件dest.txt(不存在则创建),将客户端传过来的数据写入dest.txt文件。
问题:当txt文件小于几百K的时候没问题,大于几百K的时候服务器端就会挂掉。
求解啊, 这是什么原因,怎么解决???


// 传输的数据块MAX_BUFFER等于1024
typedef struct
{
size_t size; // 发送的数据的大小
char buffer[MAX_BUFFER]; // 数据内容
bool end; // 结束标志,true结束, false继续
}DATABLOCK;

/////////////////////////////////////////////////////////////////////
// tcp 客户端发送数据的部分代码
DATABLOCK data_block;
FILE *fp = NULL;
if (fopen_s(&fp, "src.txt", "r"))
{
return 0;
}

fseek(fp, 0, SEEK_END);
long file_size = ftell(fp);// 文件大小
rewind(fp);
int count = 0;
while (file_size > 0)// 文件中的数据还没有发送完,继续发送
{
memset(data_block.buffer, 0, MAX_BUFFER);
size_t send_size = fread(data_block.buffer, 1, MAX_BUFFER, fp);
data_block.size = send_size;
// 当发送的数据不等于MAX_BUFFER,说明这是最后一小块buffer了
data_block.end = ((send_size != MAX_BUFFER) ? true : false);
send(sockClient, (const char*)&data_block, sizeof(DATABLOCK), 0);
file_size -= MAX_BUFFER;
}

//////////////////////////////////////////////////////////////////////////////////////////
// tcp 服务器端接收数据的部分代码
FILE *fp = NULL;
fopen_s(&fp, "dest.txt", "w");

DATABLOCK data_block;
while (1)
{
memset(data_block.buffer, 0, MAX_BUFFER);
recv(sockConn, (char*)&data_block, sizeof(DATABLOCK), 0);

fwrite(data_block.buffer, 1, data_block.size, fp);
if (data_block.end)
{
break;
}
}
...全文
214 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ndy_w 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tujiaw 的回复:]
为什么在客户端的while循环里面加入一句Sleep(100);就可以了
[/Quote]
这个会使TCP的Nagle算法失效,一定程度上会上TCP表现得像包。不过效率损失太大了
ndy_w 2011-09-29
  • 打赏
  • 举报
回复
看了看,你这个是个定长协议。然而TCP不是基于包而是基于流的,也就是说,你send一次的东西不一定一次recv就刚刚好全部收上来,和包不同。
所以你recv不一定能收到sizeof(DATABLOCK)个字节,也就是你应用层的包。因此你要自己分割流,还原你的应用层包。要检查返回值,该缓存的缓存。凑够了sizeof(DATABLOCK)个字节,就处理sizeof(DATABLOCK)个字节。注意,recv也可能得到跨包的数据。
ningto.com 2011-09-29
  • 打赏
  • 举报
回复
为什么在客户端的while循环里面加入一句Sleep(100);就可以了
ningto.com 2011-09-27
  • 打赏
  • 举报
回复
怎么都没人回答啊。。。。
以免我忘记 2011-09-24
  • 打赏
  • 举报
回复
首先你要知道服务器为什么挂了,是溢出还是怎么了。
smwhotjay 2011-09-24
  • 打赏
  • 举报
回复
服务端挂掉.就太悲催了. debug跑一下,找到出问题的代码.
ningto.com 2011-09-24
  • 打赏
  • 举报
回复
又有一个新发现, 如果在客户端的while循环里面加入一句Sleep(100);那么大文件也是可以传的。
所以我猜测上面的原因是不是因为客户端发送的数据太快,服务器来不及接收后写入,因此造成数据混乱。
不知道我猜测的对不对,网络编程我也是初学,不是太懂。
Eleven 2011-09-24
  • 打赏
  • 举报
回复
你Debug下调试一下看看不是写文件的地方有问题~
lijianli9 2011-09-24
  • 打赏
  • 举报
回复
memset(data_block.buffer, 0, MAX_BUFFER);
recv(sockConn, (char*)&data_block, sizeof(DATABLOCK), 0);

fwrite(data_block.buffer, 1, data_block.size, fp);
你要检测recv的返回值,看看,

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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