簡體   English   中英

Unix套接字發送接收客戶端到服務器的大塊數據錯誤

[英]Unix socket send receive client to server big chunk of data error

我有大量數據的client(php)-server(c++)通信問題。 服務器(c ++)無法從客戶端(php)接收大量數據。 當客戶端發送少量信息時,一切正常,但是當我嘗試發送大數據塊(即〜8kb)時,我斷開了通信連接(由於它是后台進程,所以不知道接收到什么服務器)。

請接收以下我使用的代碼,並在可能的情況下予以更正:

連接后的PHP部分(發送$sendbuf ):

        socket_set_nonblock($fd);               
        $b_time = 20;
        $b_tries= 0;
        while($b_time)
        {
            if (($sc=@socket_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===($out_now=@socket_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 ++部分:

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;
}
}

您收到的C代碼似乎有以下假設。

  • 數據以1024個或更少的塊的形式到達
  • 每個組塊都以魔法26結尾
  • 如果塊小於1024,則發生通信結束

但是,這不必成立。 操作系統可以自由地在您的recv(...)調用中向您提供盡可能少的數據,即使流中仍有大量數據在等待您。 音量越高,這種可能性就越大。

一旦收到少於1024字節的內容,服務器將關閉連接,PHP腳本將看到寫入錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM