2014-11-22 32 views
0

我有与大量数据通信的client(php)-server(c++)问题。服务器(C++)无法从客户端(php)接收大量数据。当客户端发送少量信息时,所有工作都很好,但是当我尝试发送大块(即〜8kb)时,我断开了通信(不知道服务器接收到了什么,因为它是后台进程)。Unix套接字发送接收客户端到服务器的大块数据错误

请,会收到以下,我使用并纠正它,如果它是可能的代码:后连接

PHP的一部分(这是送$sendbuf):

 socket_set_nonblock($fd);    
     $b_time = 20; 
     $b_tries= 0; 
     while($b_time) 
     { 
      if (([email protected]_connect($fd, $file))==FALSE && $b_tries > $b_time) 
      { 
       @socket_close($fd); 
       return false; 
      } 
      else if ($sc == true) 
      { 
       break; 
      } 
      $b_tries++; 
     } 

     $b_time=time(); 
     while($b_time) 
     { 
      $wd=array(); 

      array_push($wd,$fd); 

      if (false===($num = @socket_select($rd=NULL, $wd, $er=NULL, $select_timeout))) 
      { 
       @socket_close($fd); 
       return $result; 
      } 
      else 
      { 
       if ($num > 0) 
       { 
        if (false===([email protected]_write($fd, $sendbuf, strlen($sendbuf)))) 
        { 
         @socket_close($fd); 
         return false; 
        } 

        $b_time=$tm; 

        $sendbuf=substr($sendbuf,$out_now); 

        if (!strlen($sendbuf)) break; 
       } 
       else if ((time()-$b_time)>$timeout_write) 
       { 
        @socket_close($fd); 
        return false; 
       } 
      } 
     } 

//然后从服务器,如果确定接收答案,但没有答案。

C++ PART:

int Socket::receive (std::string& s) const 
{ 

if (current_socket < 0) return false; // error socket failed! 

char buf [1025]; 
memset(buf, 0, 1025); 

// cleanup string 
s = ""; 

int done = 0; 
int status_or_nbytes = 0; 
char* pch; 
do { 
    status_or_nbytes = ::recv (current_socket, buf, 1024, 0); 
    if (status_or_nbytes == 1024) 
    { // not all message readed, instead last byte is not SPECIAL_CHAR 
     if (buf[1023] == 26) 
     { 
      //std::cout << "S 26! " << std::endl; 
      buf[1023] = '\0'; 
      done = 1; 
     } 

     s += buf; 
    } 
    else if (status_or_nbytes > 0) // < 1024 
    { 
      if (buf[status_or_nbytes-1] == 26) 
      { 
       buf[status_or_nbytes-1] = '\0'; 
       done = 1; 
      } 

      s += buf; 
    } 
    if (status_or_nbytes <= 0) 
    { 
     done = 1; 
    } 

} while (!done); 


if (status_or_nbytes == -1) 
{ 
    std::cout << "ERROR1" << std::endl; 
    return 0; 
} 
else 
{ 
    return 1; 
} 
} 
+0

您可以收到最大。 1025字节,所以当你发送更多时它将不起作用。 – LMF 2014-11-22 14:55:25

+0

@LMF为什么我只能收到1025?我使用'do-while'从客户端合并缓冲区(1025)中的数据块并将其存储到字符串's'?代码中的错误在哪里?谢谢 – abrahab 2014-11-22 15:00:59

回答

2

您接收C-代码似乎做出以下假设。

  • 数据到达在1024或更低
  • 每个块是由通信的神奇26
  • 端终止块发生,如果一个块是较小然后1024

然而,这并不具有保持真实。即使数据流中仍有大量数据等待您,操作系统也可以免费为您提供尽可能少的数据,因为它可以在您的recv(...)调用上尽可能少地获取数据。这很容易变成音量越高。

一旦您收到少于1024字节的服务器关闭连接,PHP脚本会看到写入错误。

相关问题