0

シグナルスロットに libsigc++ を使用するのは初めてです。正常に動作している 2 つの関数があります。私のシナリオ: ソケットに recv のデータがある場合に true を返すブール関数として関数を作成しました。

bool Socket::isDataReady()
{
    void *buffer = malloc (FRAMEBUFFER + 6);
    sockaddr_in from;
    socklen_t fromLength = sizeof( from );

    if (::recvfrom(this->socketFD,buffer,FRAMEBUFFER + 6, 0, (sockaddr *)&this->getSocketAddressStructureOfServer(), &fromLength ) == -1)
    {
        if (errno == EAGAIN || errno == EWOULDBLOCK)
            return false;
    }
    return true;

}

だから、ネットからデータを取得する関数を書きました:

int Socket::readDatagrams(unsigned char *buffer, string &srcAddress, unsigned short int & srcPort)
{
    unsigned int maximumPacketSize = FRAMEBUFFER + 6;
    int returnValue ;
    sockaddr_in from;
    socklen_t fromLength = sizeof( from );
    int receivedBytes;

    fromLength = sizeof(this->getSocketAddressStructureOfServer());
    receivedBytes = recvfrom( this->socketFD, buffer, maximumPacketSize, 0, (sockaddr *)&this->getSocketAddressStructureOfServer(), &fromLength );

    returnValue = receivedBytes;
    if ( receivedBytes <= 0 )
        returnValue = -1;

    /// exporting data
    //
    srcAddress = inet_ntoa(this->getSocketAddressStructureOfServer().sin_addr);
    srcPort = ntohs( ( unsigned short int)this->getSocketAddressStructureOfServer().sin_port );


    return returnValue;
}

私は UDP サーバーを持っていて、コンストラクターですべてを初期化します。したがって、isDataReady() が true になるたびに、readDatagram 自体が実行されることを通知する必要があります。libsigc++ でどのようにコードを記述しますか? 私は彼らのチュートリアルを読みましたが、そのチュートリアルは func as sig について述べていませんでした。

4

1 に答える 1

1

私はあなたが定義することを知っています

sigc::signal<bool> ptr;

あなたのクラスの本体で。次に、クラスで接続する場合は、次のように呼び出します。

this->ptr.connect(sigc::mem_fun(*this,&NetworkSocket::createThread));

でも、話の続きがよくわからない……。

于 2012-08-03T20:36:45.953 に答える