0

我对网络编程有点陌生,我正在尝试制作一个可以处理多个客户端的套接字服务器。服务器将成为玩家和游戏引擎之间的连接,用于基于文本的冒险,用 c++ 编写。

我让代码为单个客户端工作,以及在客户端和服务器之间发送数据。实施的下一步是使其能够处理多个客户端。因为我理解 fork 是这样做的。到目前为止,我已经得到了这段代码,但我一生都无法让它发挥作用。

while (1) {
    cout << "Server waiting." << endl;
    n = sizeof(struct sockaddr_in);
    if ((clientSocket = accept(servSocket, (struct sockaddr*) (&client), (socklen_t*) (&n))) < 0) {
        cerr << "Error: " << errno << ": " << strerror(errno) << endl;
    }
    if(fork() == 0){
        cout << "Child process created. Handling connection with << " << inet_ntop(AF_INET, &client.sin_addr, buff, sizeof(buff)) << endl;
        close(servSocket);
    }
    string sendmsg;
    string recvmsg;
    int bytesRecieved = 0;
    char package[1024];
    string playerMessage;
    while(1){
        bytesRecieved = recv(clientSocket, package, 1024, 0);
        for (int offset = 0; offset < bytesRecieved/sizeof(char); ++offset) {
           playerMessage += package[offset];
        }
        cout << playerMessage;
        cin >> sendmsg;
        sendmsg += "\n";
        send(clientSocket, sendmsg.c_str(), sendmsg.size(), 0);
    }
}
close(clientSocket);
close(servSocket);
return 0;

我知道 bind() 和之前的所有事情都应该发生在带有 fork() 的主循环之前,所以我没有费心去包括它。

预先感谢!

4

1 回答 1

0

在大多数情况下,为每个连接创建进程是错误的方式。如果你有 20'000 名玩家怎么办?20,000 个进程的上下文切换会导致过多的开销降低服务器的速度。

考虑使用异步编程。boost::asio是最好的选择之一。

于 2013-10-03T19:08:24.213 回答