[英]C++ - Accepting Multiple Clients
我真的很難將多個客戶端接受到Socket Server中。 當前,僅允許一個客戶端。 當下一個客戶端嘗試加入時,該應用程序凍結並且不執行任何操作。
過去一周,我對此進行了大量研究,但似乎沒有什么令我滿意。 我已經看過有關多線程的教程,但是我沒有得到足夠的關於函數實際使用的信息(是的,我是一個非常直觀的學習者,這並不是編程的最佳選擇)。
因此,我只是想知道我能否就如何做到這一點做出很好的解釋。 如果可能的話,甚至可以在其中舉一個例子。
我還看到了這個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;
}
如您所見,這對我的客戶來說效果很好。 但只接受一個。 如何解決這個問題?
// 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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.