问题描述
已知SOCKET通过传输层的TCP协议进行通信的话。TCP协议要进行三次握手过程。那么这三次握手过程是被封装到了SOCKET对象的Accept()方法里面了吗?三次握手协议是SERVER端专门监听端口的SOCKET完成的?还是ACCEPT方法生成的SOCKET来完成最后两次握手?因为无法直观得从代码上看到三次握手的过程,所以有点疑惑
解决方案
解决方案二:
引用楼主u012159928的回复:
三次握手协议是SERVER端专门监听端口的SOCKET完成的?还是ACCEPT方法生成的SOCKET来完成最后两次握手?
应该是在监听端口的SOCKET上完成的。因为:1、Socket.Accept得到一个已建立的连接(以下是英文链接,注意created中的过去式)引用MSDN关于Socket.Accept参考
CreatesanewSocketforanewlycreatedconnection.
2、根据Berkeleysocket的定义:引用http://en.wikipedia.org/wiki/Berkeley_sockets
Theaccept()functionreturnsthenewsocketdescriptorfortheacceptedconnection
3、根据试验(需要两台机器,以及WireShark等网络嗅听软件):staticvoidMain(){using(Socketlistener=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)){listener.Bind(newIPEndPoint(IPAddress.Any,5678));listener.Listen(3);listener.BeginAccept(OnAccepted,listener);Console.ReadLine();}}staticvoidOnAccepted(IAsyncResultir){Console.WriteLine("Checkiptrafficnow.3-wayhandshakeshouldhavealreadyhappended");Thread.Sleep(5000);SockettalkingSocket=(ir.AsyncStateasSocket).EndAccept(ir);Console.WriteLine("Gottheconnectedsocketfrom:{0}",talkingSocket.RemoteEndPoint);talkingSocket.Close();}
解决方案三:
有了服务器有了客户端能收能发就行了...其他的什么反正我不去管啦因为现在都封装好了..我们也没必要去深研究...
解决方案四:
又不需要你自己去写三次握手的代码,你管它到底是哪一步呢,反正都封装好了直接调用就行了不要太纠结底层,反正纠结完你也没能力去改,胡乱改反而会不如不改了还是把Accept到底怎么用研究明白更有实际意义
解决方案五:
还有,既然是通信,那是双方的事情,不是所有代码都在其中一方就能完成的那是客户端的connect和服务端的accept共同作用的结果而且绝对不是说所有代码都在一个方法里,后面用到了各种接口,异步回调,是很复杂的一个过程,但是你用的时候就只需要知道一个connect一个accept就行了
解决方案六:
本人也曾研究过,的确相当复杂,建议还是直接用封装好的东西,自己乱改,很容易改出问题,而且还不容易调试。
解决方案七:
你听说的3次握手是.net帮你完成的,它的连接,发送消息都会进行这3次“握手”