网络编程之socket编程

 为什么要在Linux和windows系统下同时学习

大多数项目是在Linux下开发服务器端,而在Windows下开发客户端,需要经常在两大平台之间进行切换,单独学习一种平台没有实践意义。值得欣慰的是,两大平台下的 socket 编程非常相似,并不会增加多少学习成本。网络编程就是编写程序使两台联网的计算机相互交换数据。这就是socket的全部内容,socket编程远比想象中的简单很多。

基础学习

      在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的URL,向服务器发起请求,服务器分析接收到的URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户。

学习socket,也就是学习计算机之间如何通信,并编写实用的程序。

  • IP地址(IP Address):计算机分布在世界各地,要想和它们通信,必须要知道确切的位置。确定计算机位置的方式有多种,IP 地址是最常用的,例如,114.114.114.114 是国内第一个、全球第三个开放的 DNS 服务地址,127.0.0.1 是本机地址。其实,我们的计算机并不知道 IP 地址对应的地理位置,当要通信时,只是将 IP 地址封装到要发送的数据包中,交给路由器去处理。路由器有非常智能和高效的算法,很快就会找到目标计算机,并将数据包传递给它,完成一次单向通信。
    目前大部分软件使用 IPv4 地址,但 IPv6 也正在被人们接受,尤其是在教育网中,已经大量使用。
  • 端口(Port):有了 IP 地址,虽然可以找到目标计算机,但仍然不能进行通信。一台计算机可以同时提供多种网络服务,例如Web服务、FTP服务(文件传输服务)、SMTP服务(邮箱服务)等,仅有 IP 地址,计算机虽然可以正确接收到数据包,但是却不知道要将数据包交给哪个网络程序来处理,所以通信失败。为了区分不同的网络程序,计算机会为每个网络程序分配一个独一无二的端口号(Port Number),例如,Web服务的端口号是 80,FTP 服务的端口号是 21,SMTP 服务的端口号是 25。端口(Port)是一个虚拟的、逻辑上的概念。可以将端口理解为一道门,数据通过这道门流入流出,每道门有不同的编号,就是端口号。
  • 协议(Protocol):就是网络通信的约定,通信的双方必须都遵守才能正常收发数据。协议有很多种,例如 TCP、UDP、IP 等,通信的双方必须使用同一协议才能通信。协议是一种规范,由计算机组织制定,规定了很多细节,例如,如何建立连接,如何相互识别等。
  • 数据传输方式:计算机之间有很多数据传输方式,各有优缺点,常用的有两种:SOCK_STREAM 和 SOCK_DGRAM。

     1)SOCK_STREAM 表示面向连接的数据传输方式。数据可以准确无误地到达另一台计算机,如果损坏或丢失,可以重新发送,但效率相对较慢。常见的 http 协议就使用 SOCK_STREAM 传输数据,因为要确保数据的正确性,否则网页不能正常解析。

      2)SOCK_DGRAM 表示无连接的数据传输方式。计算机只管传输数据,不作数据校验,如果数据在传输中损坏,或者没有到达另一台计算机,是没有办法补救的。也就是说,数据错了就错了,无法重传。因为 SOCK_DGRAM 所做的校验工作少,所以效率比 SOCK_STREAM 高。

什么是socket?

       socket可以看成是用户进程与内核网络协议栈的编程接口。socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间的通信。

                                           

我们可以把socket底层的传输当做是底层的内核,对于上层的应用程序我们只需要关心套接口的存在,我们可以把套接口看成是进程间通信的手段。

IPv4套接口地址地址通常也称为“双际套接字地址结构”,它以“sockaddr_in”命名

struct sockaddr_in{
    uint8_t        sin_len;
    sa_family_t    sin_family;
    in_port_t      sin_port;
    struct in_addr sin_addr;
    char           sin_zero[8];
};

sin_len:整个sockaddr_in结构体的长度;sin_family:指定该地址家族;sin_port:端口;sin_addr:IPv4的地址;sin_zero:暂不使用,一般将其设置为0;

通用地址结构用来指定与套接字关联的地址。

扫描二维码关注公众号,回复: 4483764 查看本文章
struct sockaddr_in{
    uint8_t     sin_len;
    sa_family_t sin_family;
    char        sa_data[14];
};

sin_len:整个sockaddr结构体的长度;sin_family:指定该地址家族;sa_data:由sin_family决定它的形式。

猜你喜欢

转载自blog.csdn.net/baidu_29571167/article/details/84797462