socket

        IPC: Inter-Process Communication(进程间通信)。


        socket, 不同计算机(通过网络相连)上的进程相互通信的机制:网络进程间通信(network IPC),进程使用该接口能够和其他进程通信,无论它们是在同一台计算机间通信,还是在不同的计算机上进行通信。实际上,这正是socket接口的设计目标之一:同样的接口既可以用于计算机间通信,也可以用于计算机内通信。


socket    ['sɔkit]

[n.]
  • 凹穴;承口;托座
  • (人体的)臼,窝,槽
  • 【电学】 插座;管座 | [亦作 wall socket] 壁式插座
  • 【高尔夫球】(插球杆的)棒头承口
[vt.]
  • 把…装入托座(或插座);给…装上托座(或插座): 


        Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。


        对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。


        Socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须各自拥有一台电话机一样。在网间网内部,每一个Socket用一个半相关描述:(协议,本地地址,本地端口)。一个完整的Socket有一个本地唯一的Socket号,由操作系统分配。


   最重要的是,Socket是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的Socket系统调用。客户随机申请一个Socket(相当于一个想打电话的人可以在任何一台入网电话上拨号呼叫),系统为之分配一个Socket号;服务器拥有全局公认的Socket,任何客户都可以向它发出连接请求和信息请求(相当于一个被呼叫的电话拥有一个呼叫方知道的电话号码)。Socket利用客户/服务器模式巧妙地解决了进程之间建立通信连接的问题。服务器Socket半相关为全局所公认非常重要。读者不妨考虑一下,两个完全随机的用户进程之间如何建立通信?假如通信双方没有任何一方的Socket固定,就好比打电话的双方彼此不知道对方的电话号码,要通话是不可能的。
  说白了,socket是通信端点的抽象,一切皆文件,所以,socket也是文件。正如使用文件描述符访问文件,应用程序使用socket描述符访问套接字。socket描述符, 在UNIX系统中也被当做一种文件描述符。事实上,许多处理文件描述符的函数,如read()、write(),也可以用于处理socket描述符。
 调用socket()和open()类似,在这两种情况下,均可以获得I/O的文件描述符。当不在需要改文件描述符的时候,调用close()来关闭对文件或者socket的访问
socket类型,分为Internet domain 流 socket  和  Internet domain 数据报 socket。
流socket(SOCK_STREAM)提供了一个可靠的双向的字节流通信信道。可靠性:表示可以保证发送者传输的数据会完整无缺的送达接收应用程序,或者收到一个传输失败的通知。双向:表示数据可以在两个socket之间的任意方向传输。字节流:表示与管道一样,不存在消息边界的概念。
流socket的正常工作,需要一对相互连接的socket,因此流socket(TCP socket)被称为面向连接的,这在上一篇博客,分析TCP时也有提到。术语“对等socket”是指连接另一端的socket, “对等地址”是指该socket的地址, “对等应用程序”表示利用这个对等socket的应用程序。有时候,术语“远程”(或“外部”)是作为对等的同义词使用。类似的,有时候术语“本地”被用来指连接的这一端的应用程序、socket或者地址。
数据报socket是无逻辑连接的socket(UDP socket)。与流socket不同,一个数据报socket在使用时,无需与另一个socket连接。

问:现在server与client想建立socket连接,server仅知道client的IP,端口号不知道,能建立连接吗?怎么建立呢?有没有代码看看?
  答:C和S是相对而言的,发起连接的一方就是C,而监听端口接受连接的一方就是S,C如果不知道S监听的端口,怎么发起连接呢,另外,对于S而言,端口是S上各个服务的区分标志,如果用错误的端口号去连接,是不能获得正确的服务的。client的端口是不需要指定的,不像Server需要绑定端口。server需要绑定自己的端口,然后监听,client则需要使用server的IP和端口建立socket连接 


函数说明:

 int socket(int domain, int type, int protocol);

 socket()函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。正如可以给fopen的传入不同参数值,以打开不同的文件。创建socket描述符的时候,也可以指定不同的参数创建不同的socket描述符。

当我们调用socket创建一个socket时,返回的socket描述字它存在于协议族(address family,AF_XXX)空间中,但没有一个具体的地址。如果想要给它赋值一个地址,就必须调用bind()函数,否则就当调用connect()、listen()时系统会自动随机分配一个端口。


 int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
        connect函数的第一个参数即为客户端的socket描述字,第二参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过调用connect函数来建立与TCP服务器的连接。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

accept函数的第一个参数为服务器的socket描述字,第二个参数为指向struct sockaddr *的指针,用于返回客户端的协议地址,第三个参数为协议地址 的长度。如果accpet成功,那么其返回值是由内核自动生成的一个全新的描述字,代表与返回客户的TCP连接。

      注意:accept的第一个参数为服务器的socket描述字,是服务器开始调用socket()函数生成的,称为监听socket描述字;而accept函数返回的是已连接的socket描述字。一个服务器通常通常仅仅只创建一个监听socket描述字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

函数的三个参数分别为:

  •    sockfd:即socket描述字,它是通过socket()函数创建了,唯一标识一个socket。bind()函数就是将给这个描述字绑定一个名字。通常,服务器需要使用这个调用来将其socket绑定到一个总所周知的地址上,使得哭护短能够定位到该socket上。
  • addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同,如ipv4对应的是: 
    struct sockaddr_in {
        sa_family_t    sin_family; /* address family: AF_INET */
        in_port_t      sin_port;   /* port in network byte order */
        struct in_addr sin_addr;   /* internet address */
    };
    
    /* Internet address. */
    struct in_addr {
        uint32_t       s_addr;     /* address in network byte order */
    };
  • addrlen:对应的是地址的长度。
回送地址(127.x.x.x)是本机回送地址(Loopback Address),即主机IP堆栈内部的IP地址,主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,协议软件立即返回之,不进行任何网络传输。
使用Ping检查连通性有五个步骤:

    1. 使用ipconfig /all观察本地网络设置是否正确;
    2. Ping 127.0.0.1127.0.0.1 回送地址Ping回送地址是为了检查本地的TCP/IP协议有没有设置好;
    3. Ping本机IP地址,这样是为了检查本机的IP地址是否设置有误;
    4. Ping本网网关或本网IP地址,这样的是为了检查硬件设备是否有问题,也可以检查本机与本地网络连接是否正常;(在非局域网中这一步骤可以忽略)
    5. Ping远程IP地址,这主要是检查本网或本机与外部的连接是否正常。


























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值