所以我试图在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
方法中作为参数传递的侦听器会发生什么?从它的外观来看,它只会在黑洞中死去。
最后,我非常感谢能够帮助我理解套接字编程的教程/文章的任何和所有链接。
答案 0 :(得分:1)
为什么acceptCallback初始化一个新套接字?
这是BSD派生的套接字API的工作方式(并反映了TCP / IP网络堆栈的工作原理)。
您创建第一个套接字,其唯一作业是等待传入连接:通过Listen
(或变体)方法,然后通过Accept
方法(或变体)建立连接。
返回另一个Socket
实例,该实例将用于与一个客户端 1 套接字进行通信。
初始侦听套接字继续可用于新的传入连接。
这反映了服务器的模型,其中有许多客户端连接到它。
可以认为Socket
超载了两个函数:1。列出并接受连接,2。表示已建立的连接。
Stack Overflow通常不会提出建议(它们往往会过快地过时):当80年代末Sun系统运行Sun操作系统时,我学到了这一点,所以我无法推荐任何东西无论如何: - )。
1 一旦建立连接,客户端和服务器之间的操作 - 在套接字级别 - 是对称的,但考虑服务器和服务器是有用的。考虑建立联系时的客户角色。