什么是Socket?

Socket是什么?

第一次听到这个词是在很早前开始玩硬件的时候,处理器的一种插槽规格。查了字典,socket本来确实是插座的意思。那为什么在网络编程里,用到了这个单词,“Socket”。其实这个词用的也十分形象。插座如何才能正确使用呢?只有在能够插头本身合适,一个三项插头无论如何也插不到两项插座里面的。在网络编程的世界里,最基本的通信是如何做到的,对于学习过计算机网络的人来说,都应该知道:一条信息要通过物理设备和线缆传输,必须符合网络的各层协议。在传输层协议中,有TCP和UDP协议,要想建立连接,你的主机必须有一个识别自己的号码,就像你的手机号一样,但是只有一个IP地址也是不够的,两台主机想要通信,其中有很多的网络服务,这时还需要有一个唯一的端口号来识别你这条通信。这时候就需要有一个专门的对象来做这件事情:就是这个叫“Socket”的对象来做这个事情,它就像是每一台主机用于网络通信的使者,你必须提供你的Socket信息,如果双方吻合,就可以发生通信了。

     一个Socket实质上提供了进程通信的端点,每一个socket用一个半相关描述(协议,本地地址,本地端口);什么叫半相关?什么叫全相关?为什么这么叫?由于一个完整的网际间通信是需要建立于两个进程间的,一个独立的socket描述符无法做到这一点,需要双方共同出现,匹配,才会发生通信,而且最重要的是双方必须使用一种相同的高层协议进行通信,否则也是不行的。所以一个完整的网际间通信需要一个全相关的五元组(协议,本地地址,本地端口,远端地址,远端端口),也就是说两个协议相同的半相关才可以组成一个全相关。
    常见的socket类型:面向连接的流式Socket(SOCKET_STREAM)和无连接的数据报式Socket(SOCKET_DGRAM).前者适用于TCP服务应用;后者适用于UDP服务应用。
    一个TCP/IP的协议地址结构:
struct sockaddr_in
{
    short family;   //AF_INET
    u_short sin_port;  //16位端口号,网络字节顺序
    struct in_addr sin_addr;  //32位IP地址,网络字节顺序
    char sin[8];   //保留    
posted @ 2011-04-01 17:09  arcticfox1989  阅读(513)  评论(0编辑  收藏  举报