C++ - 接受多个客户端
C++ - Accepting Multiple Clients
我真的在接受多个客户端进入套接字服务器时遇到了麻烦。目前,允许一个客户端。当下一个客户端尝试加入时,应用程序将冻结并且不执行任何操作。
在过去的一周里,我对此进行了大量研究,但似乎没有什么能让我满意。我看过关于多线程的教程,但我没有得到足够的关于函数的信息来实际使用它(是的,我是一个非常直观的学习者,这不是编程的最佳选择)。
所以我只是想知道我是否可以得到一个体面到很好的解释如何做到这一点。如果可能的话,甚至可以在那里扔一个例子。
我也看到了这个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
}
}
相关文章:
- "unknown ca"自生成的 CA、证书和客户端/服务器
- 如何将函数集合传递给客户端类,以便将它们当作客户端类本身的成员使用
- 使用调试/崩溃报告将应用程序部署到客户端
- 如何在本地机器上运行c++和javascript客户端代码(hackerbank风格)
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 从服务器传输到客户端的消息不会出现
- OpenSSL TLS服务器-使用客户端证书白名单
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何绑定 C++ gRPC 客户端的网络接口
- C++套接字客户端到 Python 服务器未创建连接
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 将相机数据从服务器实时流式传输到客户端
- 如何将 Firebase 与基于 Linux 的客户端应用配合使用,以便与服务器进行双向消息通信
- GRPC C++ TLS 客户端 grpc::SslCredentials() 方法不返回
- 计算出有多少客户端可以连接到我正在使用的一些tcp服务器代码
- 如何暂停插孔音频客户端
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io