为了实现以太网通信的分层与解耦,应用程序通常并不直接驱动TCP/IP协议栈发送以太网数据包。它们通过所在系统提供的一个叫做套接字的东西,调用套接字的接口函数创建套接字处理程序。用套接字处理程序发送自己的应用数据。
返回的套接字处理程序,就代表了这个应用程序。这就是为什么当我们使用某个编程语言创建一个socket套接字对象时,会自动绑定到一个进程id,这个进程id就是我们创建套接字时的“应用程序”的进程id。
所以,不是说一定要先有应用程序,然后才能创建socket。你可以直接创建一个套接字,它就代表了一个应用。
虽然应用程序调用套接字的接口函数驱动TCP/IP协议栈实现以太网通信,已经足够方便和层次分明。但是由于socket接口是由系统提供,属于底层接口,最好不要直接调用。而且如果使用socket套接字通信,相对来说,还是比较麻烦。
比如:先要调用open接口创建套接字,然后还要调用bind接口绑定端口。如果是TCP协议,客户端还要调用connect接口发送连接请求,服务器要调用调用listen接口监听在本地端口上,当有连接请求过来时,还要调用accept接口接收这个连接请求,等等。。。
所以应用程序可以在socket套接字层和应用程序之间,再添加一层。也就是在socket套接字之上,再封装一层接口。为此,引入了应用层端点或通信端点的概念。当调用端点的openEndpoint接口函数时,即可创建这个应用程序的通信端点。对于服务器来说,用这个端点调用listenEndpoint接口函数时,即可完成socket套接字