CSocket sock;
CSendData sHead;
int nPort=7777
  if(!sock.Create())
{
strErr="socket创建失败!";
return false;
}
   if(!sock.Connect(szAddr,nPort))
{
sock.Close();   strErr="连接主机失败!";

return false;
}
//send Data to host
FillData(sHead);
int sendsize=sizeof(sHead);
if (sendsize!=sock.Send(&sHead,sendsize))
{
sock.Close();
   strErr="发送数据出错!";
char cRecv[50000];//={'\0'};
int s=sizeof(cRecv);
for(int i=1;i<50000;i++) 
cRecv[i]='\0';
int resize=sock.Receive(cRecv,50000);//sizeof(cRecv));
if (resize==0)
{
sock.Close();
strErr="没有接收到数据";
return false;
}
服务器端为UNIX平台,显示发送大小为2135字节,但是在接收时总是会丢失,接收到的字节为:1640,偶尔有一次接收正确,并且发送数据越大,丢失率越高.且丢失的字节往往都是相同大小,不知道为什么,请高手指点迷津.

解决方案 »

  1.   

    建议你我用几个接收且在发送方先告诉接收方有多长然后按此长接收不然会有你碰到的问题若想搞明白要仔细研究TCP/IP及以太网什么的.
      

  2.   

    你的服务端程序有问题,TCP是流传输的,没有包的概念,你在服务端一次接收并没有收到所有数据,还应该继续接收。
      

  3.   

    for(int i=1;i<50000;i++) 
    cRecv[i]='\0';
     最好用memset()初始化
      

  4.   

    但是知道对方发送有多长也会有问题,比如对方发送10000个,我就接收10000个字节,但是结果还是丢失,就算发送2K字节也还会丢失,SOCKET真是那么差吗?
      

  5.   

    to fengge008(风歌) \JamesJiang(欢乐英雄) 
    但是服务器只发送一次,这样有问题吗?另外,有可能每次接收的都不一样大,甚至接收到0字节,这种情况会不会出现呢?
      

  6.   

    发送时,不管发送多少数据,只调用一次Send即可  但是接收时,如果数据很多 必须多次接收,而且 每次接收到的数据量是不一样的   你可以验证一下
      

  7.   

    to fengge008(风歌) 
    那有没有一个临界范围,就是说一次接收多少字节才会不出现丢失的情况?
      

  8.   

    tcp套接字是stream类型的,而你发送的是一个结构体,可能这个结构体里含有什么特殊的字符,让系统以为已经到了流结尾就不发送后面的数据了!另外,CSocket好像收发的缓冲长度是有限的,是不是溢出了!我只是这样猜想,没有什么根据的:)
      

  9.   

    to COOL_Fire_(冷焰) (有你说的特殊字符这种情况,我接收到的字符中有一个"|",但是奇怪的是对方发送的数据没这个字符.关于是不是因为该特殊字符就停止发送数据了我也曾经考虑过这种情况,但是看到的结果是服务器发送了那么多数据.
      

  10.   

    int resize=sock.Receive(cRecv,50000);//sizeof(cRecv));
    可以试一试4096
    只是看法
      

  11.   

    if (sendsize!=sock.Send(&sHead,sendsize))
    {
    sock.Close();
       strErr="发送数据出错!";
    char cRecv[50000];//={'\0'};
    int s=sizeof(cRecv);
    for(int i=1;i<50000;i++) 
    cRecv[i]='\0';
    int resize=sock.Receive(cRecv,50000);//sizeof(cRecv));
    if (resize==0)
    {
    sock.Close();
    strErr="没有接收到数据";
    return false;
    }
    代码中SOCKET已经被关闭了,它还能收到东西吗!?(迷茫)
      

  12.   

    to zhengstar
    不好意思,刚才不小心把}删掉了,您还真心细,谢谢关注!
      

  13.   

    sizeof();对控制字符没有定义吧
      

  14.   

    to JamesJiang(欢乐英雄)
    能不能提供些相关流传输的资料?