【问题标题】:WinSock2 C++ - Multiple sockets stored as one [closed]WinSock2 C++ - 多个套接字存储为一个[关闭]
【发布时间】:2014-10-19 20:03:49
【问题描述】:

当我第一次学习在 c++ 中使用 Sockets 时,我发现了一个内容丰富的视频,但我似乎再也找不到了。它可能已被删除,但这不是重点。在视频中,制作视频的人以某种方式(在服务器应用程序上)具有三个 SOCKET 变量,一个我不记得做了什么,一个用于单个客户端,一个用于所有客户端,几乎就像一个数组。

我决定再次尝试学习sockets,我在服务器和客户端之间有一个非常简单的IM,多个客户端可以连接但客户端无法相互通信,所以我需要做的是制作一个socket数组,就像上面解释的那样,但问题是我不记得怎么做,或者如何向它添加单个连接。

如果有人知道任何其他方法可以做到这一点,我愿意寻求解决方案。代码是非常简单的主线程recv()消息,其他线程send()。客户端也一样。

感谢所有回复的人。

【问题讨论】:

  • 如何处理多个客户端是一个广泛的话题。谷歌会给你很多方法。
  • @deviantfan 感谢您的回复。我知道这是一个非常广泛的话题;但是,我确实举了一个具体的例子,除非有人知道更好(更安全,更容易,无论如何更好)的方式来做到这一点。我用谷歌搜索了它,我发现的任何东西都很难理解,或者只涵盖了服务器到客户端 IM。谢谢。

标签: c++ multithreading sockets winsock2


【解决方案1】:

一般来说有点难以回答,但如果我理解正确的话,您需要一份所有打开的套接字列表,以便稍后用于分发消息。

在你的代码中,你必须有类似的东西:

new_socket = accept(...);

创建一个全局可用的 SOCKET 变量数组,并在建立连接时将new_socket 添加到其中。

如果您使用 C++,请使用 STL 容器。包含#include <list> 并作为全局变量定义:

std::list<SOCKET> Connections;

比接收新连接时做的:

new_socket = accept(...);
Connections.push_back(new_sockets);

当你想使用发送给他们所有人时:

for(std::list<SOCKET>::iterator i=Connections.begin(); i!=Connections.end(); i++)
   ... use (*i) as a socket 

当连接关闭时,只需将它们从向量中删除:

Connections.remove(old_socket);

正如在 cmets 中所讨论的,您可以使用像 SOCKET Connections[20] 这样的简单数组来执行此操作,但是在插入和删除元素时您必须手动处理数组。所有这些已经在 std::list 中完成。重新发明轮子没用。

【讨论】:

  • 好的,是的,我想要的你是正确的,所有打开的套接字的列表。所以,我认为我们走在正确的轨道上,我不确定是否存在诸如套接字变量数组之类的东西。如果我正确理解您的答案,我可以这样做来定义我的套接字数组: SOCKET Connections[20];从那里唯一的问题是我如何实际将 new_socket 添加到连接。我已经有 new_socket 被接受了。
  • 您只需说Connections[5]=new_socket;。这是简单的部分。诀窍是您必须处理连接消失的问题,因此您必须从 Connections 中删除相应的值。
  • 好的,所以我们知道如何添加它们,但是如何删除它们。我可以保留一个变量,例如Count,并为每个连接添加1并删除Connections[Count],问题是我如何清除插槽?
  • @Reborn 只需将所有连接向下移动一个插槽并减少插槽数。
【解决方案2】:

您需要维护一个列表,该列表将存储 Socket FD(文件描述符)。 FD 是整数,对于每个套接字都是唯一的。正如您所评论的,您知道如何添加它们。

要删除它们,您将首先调用 close() 套接字 API 来关闭套接字。您将了解在this 链接中使用 FD 关闭套接字。成功关闭套接字后,只需删除包含已关闭套接字的 FD 的索引。如果你有任何进一步的疑问,你可以问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    相关资源
    最近更新 更多