0

複数のクライアントを Socket Server に受け入れるのに本当に問題があります。現在、1 つのクライアントが許可されています。次のクライアントが参加しようとすると、アプリはフリーズして何もしません。

私はこれについて先週たくさんの調査をしましたが、私を満足させるものは何もないようです. マルチスレッドに関するチュートリアルを見たことがありますが、実際に機能するための十分な情報が提供されていませんでした (はい、私は非常に視覚的な学習者であり、プログラミングには最適ではありません)。

そのため、これを行う方法についてまともな説明を得ることができるかどうか疑問に思っていました. 可能であれば、そこに例を入れることもできます。

この関数も見ましたがselect()、十分な情報が提供されていませんでした。

私は稼働中のサーバーを持っていますが、マルチスレッディングが頭を悩ませ始めています。状況とその仕組みについて非常に混乱しています。

ですから、説明と例があれば、それは素晴らしいことです!

これは現在のサーバー コードですが、複数のクライアントを有効にするにはどうすればよいですか?

#include <iostream>
#include <winsock2.h>
#include <vector>

bool gamerunning = true;
bool srvr_connect = false;
int srvr_rec = 0;

int main() {
    WSAData wsa;
    WORD Version = MAKEWORD(2, 1);

    WSAStartup(Version, &wsa);

    SOCKET Listen;
    SOCKET Connect;

    Listen = socket(AF_INET, SOCK_STREAM, 0);
    Connect = socket(AF_INET, SOCK_STREAM, 0);

    SOCKADDR_IN Server;

    Server.sin_addr.s_addr = inet_addr("192.168.2.4");
    Server.sin_family = AF_INET;
    Server.sin_port = htons(100);

    bind(Listen, (SOCKADDR*)&Server, sizeof(Server));

    listen(Listen, 4);

    int size = sizeof(Server);

    std::cout << "Your server has been started!\nConnecting...\n";

    Connect = accept(Listen, (SOCKADDR*)&Server, &size);

    while (gamerunning) {
        if (Connect != NULL) {
            srvr_connect = true;
            std::cout << "Welcome to player: " << srvr_rec << "\n";
            srvr_rec +=1;
        }
        if (srvr_connect == true) {
            if (test_frame == 0) {
                std::cout << "Connection Sent!\nConnection Has Been Breached!\nPlayers Are Now Able to Join Your Server!\n";
                test_frame +=1;
            }
        }
    }
    std::cin.get();
    return 0;
}

ご覧のとおり、これは私のクライアントにとって非常にうまく機能します。ただし、受け入れるのは1つだけです。これを機能させるにはどうすればよいですか?

4

1 に答える 1

0
// define a list of sockets
// create the socket you are going to accept on and add the socket to the list
while( true ) {
    // use the list to build the read set
    select( .. read-set .. )
    for( all sockets in the read-set ) {
         if( socket == accept-socket ) {
               // do accept
               // add the new socket to the list
         } else {
               // read data from the socket
         }
    }
}

このように select() を使用します

fd_set readfds;
fd_set writefds;
fd_set exceptfds;
FD_ZERO( readfds );
FD_ZERO( writefds );
FD_ZERO( exceptfds );
int nfds = 0;
for( all socket x in socket list ) {
    FD_SET( x, readfds )
    nfds++;
}
int rc = select( nfds, & readfds, & writefds, & exceptfds, 0 );
for( all socket x in socket list ) {
    if( FD_ISSET( x, readfds ) ) {
        // socket x has something to read or accept
    }
}
于 2013-01-26T02:15:02.470 に答える