阻塞方式下数据传输接收的问题

adafirst3219 2005-03-10 12:06:23
我用线程阻塞方式传输数据,客户端代码如:
  WskStream->Write(m_sUserName.c_str(),m_sUserName.Length());
WskStream->Write(m_sProjCode.c_str(),m_sProjCode.Length());
  WskStream->Write(m_sProjName.c_str(),m_sProjName.Length());
if(!WskStream->WaitForData(TimeOut))
{
Msg("连接服务器超时.");
delete WskStream;
ClientSocket1->Active=false;
::Sleep(500);
return;
}
iRtn=WskStream->Read(FlagBuf,FLAG_BUF_SIZE);
memcpy(Flag,FlagBuf,iRtn);
if(strcmpi(Flag,sBack)!=0)
{
Msg("服务器响应错误.");
delete WskStream;
ClientSocket1->Active=false;
::Sleep(500);
return;
}
服务端代码如:
    if(WskStream->WaitForData(TimeOut))
{
iRtn=WskStream->Read(FlagBuf,FLAG_BUF_SIZE);
memcpy(sUserName,FlagBuf,iRtn);
}
if(WskStream->WaitForData(TimeOut))
{
iRtn=WskStream->Read(FlagBuf,FLAG_BUF_SIZE);
memcpy(sProjCode,FlagBuf,iRtn);//在此发觉接收了客户端第二第三步发送的数据
}
if(WskStream->WaitForData(TimeOut))
{
iRtn=WskStream->Read(FlagBuf,FLAG_BUF_SIZE);
memcpy(sProjName,FlagBuf,iRtn);//到这里后可能就接收不到客户端第三步发送的数据了,就塞在这里,而客户端需要下面的OK回应,可得不到,客户端就超时了,这种情况为什么会发生?应该怎样解决呀。
}

WskStream->Write("OK\0",3);
...全文
227 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
GHOSTWY 2005-03-21
  • 打赏
  • 举报
回复
学习
顾君彦 2005-03-21
  • 打赏
  • 举报
回复
你的写法上存在问题.
发送数据一能一次性发送,
虽然从程序上看起来,你是分两次调用了发送的,其实,
从顺序上来讲,还是一次性发送.
网络传输,从形式上来讲,是一种流的状态,所以,分几次发送,和一次发送,道理上是一样的.
所以,你在服务器上一下收到连续两次发送的内容,若你把服务器和客户机放到INTERNET上,
由于网络状况不好,可能服务器收几次都收不完第一次发送的内容,很有可能的.

所以,你的程序按客户机发送,服务器响应,客户机发送,服务器响应这种模式来进行编写.
并且,在每个指令里,都需要约定一种方式来判断是否该条指令已经结束,还是正传输到一半.

这是我的一点点建议,因为我没有使用过BCB编写程序,所以,我也没办法直接来对你的程序进行
修改.
loveenic2 2005-03-21
  • 打赏
  • 举报
回复

关注。

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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