具有多个连接的 C++ 服务器套接字

Posted

技术标签:

【中文标题】具有多个连接的 C++ 服务器套接字【英文标题】:C++ Server socket with multiple connections 【发布时间】:2014-11-19 01:14:09 【问题描述】:

我正在尝试创建程序,它托管一个服务器并允许多个客户端加入一个服务器。我能够创建服务器套接字,它只允许一个连接,但我无法适应我的多线程知识。我的每当客户端连接时(创建新线程时),代码都会引发运行时错误。这是我的代码: 整数结果; 诠释recvbuf; int dataReceived;

int save(int key_stroke,char *file);


class ClientHandler
public:
    void operator()(SOCKET s)
        try
            do
            result = recv(s,(char*)&recvbuf,4,0);
            dataReceived = ntohl(recvbuf);
            if(result>0)
                save(dataReceived,"log.txt");
            else
                cout << "CONNECTION LOST!" << endl;
            

            while(result > 0);
        catch(...)
    

;


int main()

    WSAData wsa;
    WORD version = MAKEWORD(2,1);

    WSAStartup(version, &wsa);

    SOCKET Listener = socket(AF_INET,SOCK_STREAM,NULL);
    SOCKET Connect = socket(AF_INET,SOCK_STREAM,NULL);

    SOCKADDR_IN Server;

    Server.sin_addr.s_addr = INADDR_ANY;
    Server.sin_family = AF_INET;
    Server.sin_port = htons(5125);

    int sizeOf = sizeof(Server);
    bind(Listener, (SOCKADDR*)&Server , sizeOf);
    listen(Listener,100);
    cout << "Listening" << endl;
    for(;;)
            Connect = accept(Listener,(SOCKADDR*)&Server , &sizeOf);
            cout << "CONNECTION MADE!" << endl;
            thread t1((ClientHandler()) ,Connect);
          


【问题讨论】:

“无法适应”和“我的代码抛出运行时错误”不是问题描述。请详细说明。 对不起,但它只是说,该应用程序抛出运行时错误并返回 3。 即使3 也是新信息。您应该已经粘贴了确切的错误消息并表明您正在这样做。 【参考方案1】:

那是因为您在创建线程后就将其删除。您需要将它们保存在某个地方:

std::vector<std::unique_ptr<std::thread>> threads;
for (;;) 
    // as before
    threads.emplace_back(new std::thread((ClientHandler()), Connect));

【讨论】:

谢谢大佬,真的有用!如果我理解正确的话,你创建了一个列表,类型是:线程。然后每次有人连接,你创建一个新线程,你添加到列表中?跨度> 好吧,向量不是列表,它是 unique_ptr 的向量而不是线程的向量。但是,是的,每当您获得新客户端时,您都会创建一个新线程并将其添加到向量中。【参考方案2】:

由于您使用的是 C++ 套接字编程,因此您可能想要使用 QT C++ 库。它是免费的、开源的,并且已经解决了大多数问题,并且是一个很好的、有据可查的 api:

http://qt-project.org/doc/qt-5/qtnetwork-threadedfortuneserver-example.html

所有示例: http://qt-project.org/doc/qt-5/examples-network.html

【讨论】:

以上是关于具有多个连接的 C++ 服务器套接字的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中处理单个服务器和多个客户端

在 ios 中具有相同服务和特性的多个 BLE 设备

多个连接套接字c ++

C++服务器设计:基于I/O复用的Reactor模式

终止大量 SSL 连接具有成本效益

C++ winsock服务器中非阻塞模式与异步套接字的区别