gpt4 book ai didi

c - 如何在 session 中获取新的套接字连接?

转载 作者:行者123 更新时间:2023-11-30 16:02:16 25 4
gpt4 key购买 nike

我使用带有 send()recv() 的 C 风格 TCP 套接字。我有一个在用户 A 和用户 B 之间运行的连接,其中用户 A 充当服务器,用户 B 充当客户端。

我想要一个被动用户 C,它不进行任何通信,但从用户 A 接收数据。但是,新的被动用户 C 可以随时加入 session 。 A 可能会向 C 发送与向 B 发送的数据包不同的数据包。我想 A-C 最好在与 A-B 不同的端口上进行通信

如何在任意通信点建立此连接(无需线程等)?

编辑仍未解决。

最佳答案

您可以设置一个监听器来检测新连接,并将流量镜像到所有打开的套接字。我最近用 C# 写了我的意思:(我会看看是否可以快速将其转换为 C 示例)

此示例在开始时仅接受固定数量的传入连接,但更改它非常容易。

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Linq;

public class Demo
{
static IList<Socket> StartServer(int numberOfClients)
{
using(Socket main = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
main.Bind(new IPEndPoint(IPAddress.Any, 9050));
main.Listen(numberOfClients);

var clients = Enumerable
.Range(1,numberOfClients)
.Select(i => {
Console.WriteLine("Waiting for 1 more client...");
Socket client = main.Accept();
Console.WriteLine("Connected to {0}", client.RemoteEndPoint);
return client; })
.ToList();
main.Close();

return clients;
}
}

public static void Main()
{
var clients = StartServer(4);

while(clients.Count()>1) // still a conversation
{
var copyList = clients.ToList();
Console.WriteLine("Monitoring {0} sockets...", copyList.Count);
Socket.Select(copyList, null, null, 10000000);

foreach(Socket client in copyList)
{
byte[] data = new byte[1024];
int recv = client.Receive(data);

if (recv == 0)
{
Console.WriteLine("Client {0} disconnected.", client.RemoteEndPoint);
client.Close();
clients.Remove(client);
}
else
foreach (var other in clients.Except(new [] {client}))
other.Send(data, recv, SocketFlags.None);
}
}
Console.WriteLine("Last client disconnected, bye");
}
}

关于c - 如何在 session 中获取新的套接字连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5532747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com