0

現在、 TIdTCPServerおよびTIdTCPClient Indy コンポーネントを使用してサーバーとクライアントを完全に作成することに成功していますが、2 つのクライアントが同時にサーバーに接続すると問題が発生しました。私には 2 つのネットワークが192.168.10.23ありlocalhost、クライアントが localhost を使用して接続する場合は問題なく、2 番目のクライアント192.168.10.23は最初のクライアントの切断を待ってそこに接続しようとします。

Indy10 を使用して複数のクライアントを処理する方法を教えてください。

追加した:

この私のコード:

void __fastcall TfrmServer::TCPServerConnect(TIdContext *AContext)
{
    TList *list = TCPServer->Contexts->LockList();
    try
    {
        for (int j=0; j < list->Count; j++)
        {
            TIdContext *myContext = static_cast<TIdContext*>(list->Items[j]);
            CLIENT_AUTH(myContext);

            INFO_CLIENT *br = ((INFO_CLIENT*)brb);
            br->ClientIP    = myContext->Binding()->IP;
            br->ClientPort  = myContext->Binding()->Port;
            br->peerIp      = myContext->Binding()->PeerIP;
            br->peerPort    = myContext->Binding()->PeerPort;

            if (myContext->Connection->Connected())
            {
                for (int i=0; i < list->Count; i++)
                {
                    ListIt = ListClient->Items->Add();
                    ListIt->Caption = String(i+1); // number
                    ListIt->SubItems->Add(br->UserName); // Name
                    ListIt->SubItems->Add(br->ClientIP); // Ip
                    ListIt->SubItems->Add(br->peerIp); // Peer Ip
                    ListIt->SubItems->Add(br->ClientPort); // port
                    ListIt->SubItems->Add(br->peerPort); // port
                    ListIt->SubItems->Add("Connected"); // Status
                }
            }
        }
    }
    __finally
    {
        TCPServer->Contexts->UnlockList();
    }
}

このコードは複数のクライアントをサポートしていましたか?

4

1 に答える 1

3

TIdTCPServer複数のネットワークでの複数の同時接続をサポートし、それは問題なく機能します。クライアントが相互にシリアル化する場合、問題は独自のコードまたはネットワーク設定にある必要があります。Indyは、複数のクライアントが同時に同じサーバーに接続することを妨げません。

更新:これを試してください:

class TAddToListSync : public TIdSync
{
protected:
    TIdContext *FContext;

    void __fastcall DoSynchronize()
    {
        TListItem *ListIt = frmServer->ListClient->Items->Add();
        ListIt->Caption = String(ListIt->Index+1); // number
        ListIt->SubItems->Add(...); // Name
        ListIt->SubItems->Add(FContext->Binding()->IP); // Ip
        ListIt->SubItems->Add(FContext->Binding()->PeerIP); // Peer Ip
        ListIt->SubItems->Add(FContext->Binding()->Port); // port
        ListIt->SubItems->Add(FContext->Binding()->PeerPort); // port
        ListIt->SubItems->Add("Connected"); // Status
    }

public:
    __fastcall TAddToListSync(TIdContext *AContext)
        : TIdSync(), FContext(AContext)
    {
    }

    static void Add(TIdContext *AContext)
    {
        TAddToListSync *sync = new TAddToListSync(AContext);
        sync->Synchronize();
        delete sync;
    }
};

void __fastcall TfrmServer::TCPServerConnect(TIdContext *AContext) {
{
    CLIENT_AUTH(AContext);
    TAddToListSync::Add(AContext);
}
于 2012-07-03T22:23:30.477 に答える