Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
套接字编程中的客户端到客户端消息传递 我正在研究一个基于C++的Winsock服务器客户端应用程序。我已经完成了服务器和客户端之间通信所需的一切工作,以便能够在它们之间发送和接收消息_C++_Sockets_Client_Server - Fatal编程技术网

套接字编程中的客户端到客户端消息传递 我正在研究一个基于C++的Winsock服务器客户端应用程序。我已经完成了服务器和客户端之间通信所需的一切工作,以便能够在它们之间发送和接收消息

套接字编程中的客户端到客户端消息传递 我正在研究一个基于C++的Winsock服务器客户端应用程序。我已经完成了服务器和客户端之间通信所需的一切工作,以便能够在它们之间发送和接收消息,c++,sockets,client,server,C++,Sockets,Client,Server,现在我需要知道如何完成客户端到客户端的消息传递部分,以及必须如何完成这项工作。我只知道,例如,如果客户端A和客户端B需要相互通信,客户端A必须将消息发送给服务器,服务器接收消息并将其发送给客户端B 如果这是正确的方法,请帮助我了解服务器应该如何知道接收方的任何信息(在本例中是客户端B) 如果我没有解释清楚我的问题,请告诉我 感谢您的帮助 客户端A与服务器对话 客户端B与服务器对话 服务器确定A需要直接与B对话,反之亦然 服务器向A和B发送一条消息,其中包含如何相互通信的详细信息(IP地址、端口等

现在我需要知道如何完成客户端到客户端的消息传递部分,以及必须如何完成这项工作。我只知道,例如,如果客户端A和客户端B需要相互通信,客户端A必须将消息发送给服务器,服务器接收消息并将其发送给客户端B

如果这是正确的方法,请帮助我了解服务器应该如何知道接收方的任何信息(在本例中是客户端B)

如果我没有解释清楚我的问题,请告诉我

感谢您的帮助

  • 客户端A与服务器对话
  • 客户端B与服务器对话
  • 服务器确定A需要直接与B对话,反之亦然
  • 服务器向A和B发送一条消息,其中包含如何相互通信的详细信息(IP地址、端口等)。消息还详细说明了哪些(A或B)将启动联系、超时等
  • 收到后,每个A和B开始侦听服务器详细说明的端口
  • 消息中设置为发起联系的人会这样做(A与B对话,反之亦然)

  • 除非我完全没有抓住问题的重点。您需要定义两条新消息,其中包含a和B对话和发送给a和B所需的所有详细信息,他们需要接收/处理消息并做出相应反应。

    实现这一点的一种方法是,在通过实际服务器进行通信后,让一个客户端充当服务器。您需要创建自己的协议。也就是说:

    1-客户端A:-嘿,服务器!。告诉客户B创建一个通信服务器,这样我就可以直接与他通信

    2-服务器:-嘿,客户端B!。启动一个服务器实例并告诉我连接属性,这样我就可以将其中继到客户端,这样他就可以连接到您

    3-客户端B:-嘿,服务器!。我已准备好接受客户端A的连接请求。以下是我的连接属性

    4-服务器:-客户端A!!这里是客户端B的连接属性。接受它或离开它。。。我做完了

    5-客户端A:-嘿,服务器B!。。我能接通吗


    这就是协议。。因此,任何客户端首先向服务器发起一个请求,该请求包含消息类型“me,requesting to connect to client x…”。服务器命令客户端x,客户端x响应,服务器将响应中继到启动器客户端。。。此外,为了管理整个协议,您还应该实施错误处理、拒绝策略或其他一些您可以想到的事情。

    将客户机-服务器通信视为旧的无线电通信

  • A需要和B说话,所以B必须在听
  • A完成了他的演讲(您只需发送一个关键字,比如“//EOC”,或使用固定宽度的消息)
  • B需要和A说话,所以A不能说话,让B和A说话
  • 迭代直到通信命令结束

    所以,想象一下,谈话是
    ,而倾听是

     B:  read  -> A:  write 
     A:  read  -> B:  write 
    

    请记住使用关键字断开两个客户端的连接,否则系统调用可能会出现一些不良行为

    我的做法是,每次客户端连接到服务器时,我都会给该客户端一个唯一的ID。每当其他客户端想要发送消息时,它都会发送接收者的唯一ID和消息。服务器使用消息的预期ID将该消息发送到客户端。我有一个为客户端“轮询”服务器的功能。每次客户端连接到服务器时,我都会向每个客户端发送一个命令,以更新其联机列表。当客户端断开连接时,它会向每个客户端发送一个命令以更新其列表。。基本上就像msn messenger。这是一个有趣的解决方案。但是当你说“当另一个客户想要发送一条消息时,它会发送接收者的UniqueID和消息。”,你的意思是它会发送两条不同的消息,一条用于接收者的UniqueID,另一条用于消息,还是消息必须同时包含这两种信息以及消息的格式?我制定了自己的格式。它是这样的:struct CMsg{unsigned long ID,Length,Command;char*Message;};我将结构写入字节数组,并将其发送到服务器。服务器读取ID(sizeof(unsigned long)),然后读取长度,然后读取命令。最后,它显示“长度”字符数(信息)。@Brandon谢谢你。你的解释对我帮助很大。但我还有一个问题。我不确定我可以在这里问这个问题,或者我应该再问一个问题。我需要知道,如果我想在另一个平台(如android)上编写另一个客户端应用程序,客户端可以发送什么消息?我们如何从java访问CMsg结构?如果两个客户端都不能启动服务器(在它们后面的防火墙上戳一个洞),那么就不可能将消息路由到客户端。在这种情况下,您可以尝试一些肮脏的技巧(从两端发送UDP数据包,然后查看是否可以接收“回复”),但没有真正保证的解决方案。@Speed8ump UDP数据包是邪恶的!:)客户端B可以在上面的第3阶段说“服务器,我无法创建通信服务器”,而服务器可以在第4阶段中继“客户端a,客户端B无法为您服务…”。或者,如果客户端b能够启动服务器,但有防火墙,则服务器可以在第3阶段后测试b的连接属性,而不是在第4阶段说“这里是道具”,他可以说“客户端b已启动,但无法连接”到客户端a。。是的,对此没有保证的解决方案。这就是为什么协议应该得到很好的管理。。