服务器转发数据失真问题

qz1015 2006-05-21 09:47:02
客户端A把一个文件利用一个结构体循环发送到服务器,服务器收到数据以后数据进行分析并发送到相应的客户端B,现在客户端B可以完整地收到文件,可是文件却不能用,服务器采用的是完成端口的模式,这个问题该怎么解决。
...全文
151 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
weiziyuner 2006-05-22
  • 打赏
  • 举报
回复
在服务器保存这个文件试试,可能是你客户端A发送到服务器就发送错了,你发送的时候有没有把int lock;发送给服务器?
xx_jj 2006-05-22
  • 打赏
  • 举报
回复
最好不要用结构 建议用缓冲区的办法
qz1015 2006-05-22
  • 打赏
  • 举报
回复
现在的问题是出在服务器的中转上面,我在测试的时候让客户端之间直接传世可以的,但是就是通过服务器就不行了
pripor 2006-05-22
  • 打赏
  • 举报
回复
使用二进制比较工具
看看是文件哪一部分发生改变

由此推测代码上面可能的问题
9731boy 2006-05-22
  • 打赏
  • 举报
回复
你传输的应该是binary的数据

你可能用文字串的方式来传送了.

oyljerry 2006-05-21
  • 打赏
  • 举报
回复
可能文件没有正确的传递过去,检查一下
realphenix 2006-05-21
  • 打赏
  • 举报
回复
你参考一下

/************************************************************************************/
//Start resending circle
//The kernel of main project
struct BUF
{
char data[1024*1];
int lock;
};
BUF buf_c;
BUF buf_s;
buf_c.lock = 0;
buf_s.lock = 0;
int slen;

while( GetLastError() == 0 )
{
//Reset the fdread set
FD_ZERO(&fdread);
FD_SET(sock_c,&fdread);
FD_SET(sock_s,&fdread);
//Reset the fdwrite set
FD_ZERO(&fdwrite);
FD_SET(sock_c,&fdwrite);
FD_SET(sock_s,&fdwrite);

if( SOCKET_ERROR != select(0,&fdread,NULL,NULL,NULL) )
{
if( FD_ISSET(sock_c,&fdread) && buf_c.lock == 0 )
{
std::cout<<"Sock_c ready!"<<std::endl;
slen = recv(sock_c,buf_c.data,sizeof(buf_c.data),0);
buf_c.lock = 1;
if( SOCKET_ERROR != send(sock_s,buf_c.data,slen,0) )
{
std::cout<<slen<<std::endl;
buf_c.lock = 0;
}

}
if( FD_ISSET(sock_s,&fdread) )
{
std::cout<<"sock_s ready!"<<std::endl;
slen = recv(sock_s,buf_s.data,sizeof(buf_s.data),0);
buf_s.lock = 1;
if( SOCKET_ERROR != send(sock_c,buf_s.data,slen,0) )
{
buf_s.lock = 0;
}
}
}

}
/************************************************************************************/
DentistryDoctor 2006-05-21
  • 打赏
  • 举报
回复
是丢失了数据,还是包的顺序被打乱了?
striking 2006-05-21
  • 打赏
  • 举报
回复
应该用二进制打开文件,然后传送

18,357

社区成员

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

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