在每种方法中初始化一个新套接字是件好事吗?

时间:2016-04-27 09:57:56

标签: c# .net sockets asyncsocket

所以我试图在C#.NET中解决套接字编程问题,但是没有关于它的好文章/指南来自我所看到和发现的内容(甚至官方的MSDN网站也有过时的代码) )。我试图关注此链接here,但由于它已过时,我不确定其中包含的代码是否被视为良好做法。 所以,有这段代码:

public void StartListening() {
    Socket listener = new Socket( localEP.Address.AddressFamily,
    SocketType.Stream, ProtocolType.Tcp );

    listener.BeginAccept(new AsyncCallback(acceptCallback), listener);
}

然后是这段代码:

public void acceptCallback(IAsyncResult ar) {
    Socket listener = (Socket) ar.AsyncState;
    Socket handler = listener.EndAccept(ar);
}

为什么acceptCallback初始化一个新套接字?为什么所有方法都初始化自己的套接字?如果只有这样一个类级别的私有套接字

,那会不会更好

private Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);?为什么它首先创建一个侦听器套接字然后创建一个处理程序套接字?那是什么意思?另外,在BeginAccept方法中作为参数传递的侦听器会发生什么?从它的外观来看,它只会在黑洞中死去。

最后,我非常感谢能够帮助我理解套接字编程的教程/文章的任何和所有链接。

1 个答案:

答案 0 :(得分:1)

  

为什么acceptCallback初始化一个新套接字?

这是BSD派生的套接字API的工作方式(并反映了TCP / IP网络堆栈的工作原理)。

您创建第一个套接字,其唯一作业是等待传入连接:通过Listen(或变体)方法,然后通过Accept方法(或变体)建立连接。

返回另一个Socket实例,该实例将用于与一个客户端 1 套接字进行通信。

初始侦听套接字继续可用于新的传入连接。

这反映了服务器的模型,其中有许多客户端连接到它。

可以认为Socket超载了两个函数:1。列出并接受连接,2。表示已建立的连接。

Stack Overflow通常不会提出建议(它们往往会过快地过时):当80年代末Sun系统运行Sun操作系统时,我学到了这一点,所以我无法推荐任何东西无论如何: - )。

1 一旦建立连接,客户端和服务器之间的操作 - 在套接字级别 - 是对称的,但考虑服务器和服务器是有用的。考虑建立联系时的客户角色。