gpt4 book ai didi

C# 并发和异步套接字连接

转载 作者:太空狗 更新时间:2023-10-30 00:39:57 24 4
gpt4 key购买 nike

我正在开发一个简单的套接字服务器,它应该接受多个连接并通过 EndAccept() 将它们交给“连接”类问题是在接受一个连接,代码在连接结束之前不会接受任何进一步的内容。

我像这样在 Main() 中创建套接字,然后通过 Initialize() 将套接字传递给 ServerEnvironment(静态类)。

MainSocket.Bind(new IPEndPoint(IPAddress.Parse(Addr), Port));
MainSocket.Listen(10);

ServerEnvironment.Initialize(MainSocket);

while (true)
{
Console.ReadLine();
Console.WriteLine(">>");
}

一旦 MainSocket 被传递,ServerEnvironment 就会从那里接管。

static Socket MainSocket;

public static void Initialize(Socket _MainSocket)
{
MainSocket = _MainSocket;

AcceptGameConnection = new AsyncCallback(AddConnection);
MainSocket.BeginAccept(AcceptGameConnection, null);
}

public static void AddConnection(IAsyncResult Result)
{
Socket UserSocket = MainSocket.EndAccept(Result);
ConnectionCount++;

// Removed the stuff that happens to UserSocket because the same
// symptoms occur regardless of their presence.

MainSocket.BeginAccept(AcceptGameConnection, null);
}

当我搜索这个问题时,我发现多线程可能是我的目的所必需的。但是,当我在 Initialize();AddConnection(); 中使用 Console.WriteLine(Thread.CurrentThread.ManagedThreadId); 时,两个出现不同的线程ID,所以我假设多线程已经是一种能力,我不需要手动创建线程。不过,这并不能解释我的问题。

我是否需要多线程才能拥有并发和异步套接字连接?

编辑:绑定(bind)错误..绑定(bind)到我的 LAN 地址导致了一些问题。

最佳答案

如果您使用的是 .net 4.0 或更低版本,这就是您想要执行此操作的方式

public static void Initialize(Socket _MainSocket)
{
MainSocket = _MainSocket;

AcceptGameConnection = new AsyncCallback(AddConnection);
MainSocket.BeginAccept(result => {
var userSocket = MainSocket.EndAccept(result);
var thread = new Thread(AddConnection);
thread.Start(userSocket);
Initialize(MainSocket);
}, null);
}

public static void AddConnection(IAsyncResult Result)
{
MainSocket.BeginAccept(AcceptGameConnection, null);
}

private static void AddConnection(Socket userSocket)
{
// Removed the stuff that happens to UserSocket because the same
// symptoms occur regardless of their presence.
}

但这是在 .net 4.5 或更高版本中可以做到的。

public static void Initialize(Socket mainSocket)
{
while(true)
{
var userSocket = await Task.Factory.FromAsync(
mainSocket.BeginAccept,
mainSocket.EndAccept);
ThreadPool.QueueUserWorkItem(_ => AddConnection(userSocket));
}
}

private static void AddConnection(Socket userSocket)
{
// Removed the stuff that happens to UserSocket because the same
// symptoms occur regardless of their presence.
}

关于C# 并发和异步套接字连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32160347/

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