学习笔记(linux高级编程)12

网络编程

   open system interconnect

1、OSI 模型  ===》开放系统互联模型  ==》分为7层:

   理想模型  ==》尚未实现

       tftp

       b  /etc/passwd

       a /etc/123

       应用层 

       表示层  加密解密  gzip

       会话层  网络断开,连接状态,keep-close keep-alive

       传输层tcp  udp  协议  文件    视频,音频

       网路层ip   NAT

       链路层  交换机  数据的格式化  帧 校验

       物理层         100Mb/8  Gbits   100MB 同轴电缆 10Gb    2.4G 5G

  TCP/IP模型  ==》网际互联模型   ==》分为4层:

  实用模型  ===》工业标准

  tcp/ip协议栈

       应用层   ====》应用程序

       传输层   ====》端口号tcp udp

       网络层   ====》IP 地址

       接口层   ====》网卡 驱动  1GB

pcap ,,,

2、TCP/IP协议族:

   www.taobao.com ---> 192.168.0.19

   www.voa.com vpn 

   dns 域名解析

   DHCP

   应用层: HTTP TFTP FTP SNMP DNS ...

   传输层: TCP  UDP   56k猫

   网络层: IP  ICMP(ping) RIP OSPF IGMP ...

   物理层: ARP  RARP  ...   ip--->mac 

   arp,,,,

   192.160.0.112

========================================================

TCP编程基础知识:

1、网络基础 ===》A B C D E 类

010 3333344444

IP地址 == 网络位 + 主机位

IP地址的分类: 点分十进制   ipv4  712934

   A类: 超大规模性网络

                    8   8   8   8

       1.0.0.0 - 126.255.255.255  126.1.1.1

                                      126.1.1.2

       255.0.0.0   

       私有:

       10.0.0.0 - 10.255.255.255

       127.0.0.1

   B类: 大中规模型网络

       128.0.0.0 - 191.255.255.255

       128.2.1.2  128.2.7.2

       255.255.0.0

       私有:

       172.16.0.0 - 172.31.255.255

   C类: 中小规模型网络

       192.0.0.0 - 223.255.255.255

       255.255.255.0

       私有:

       192.168.0.0 - 192.168.255.255

       静态路由

       192.168.0.0

       192.168.0.1  网关

       192.168.0.255

   D类: 组播和广播

       224.0.0.0 - 239.255.255.255

       192.168.0.255 ==  255.255.255.255

       235.1.2.3

       192.168.1.0

       192.168.0.1   网关

       192.168.1.255 广播

   E类: 实验

       240.0.0.0 - 255.255.255.255

   C 类网络:

       ip地址的前三组是网络地址,第四组是主机地址。

   二进制的最高位必须是: 110xxxxx开头

   十进制表示范围: 192.0.0.0 -223.255.255.255

   默认网络掩码:   255.255.255.0

   网络个数: 2^24 个 约 209 万个

   主机个数: 2^8  个 254 个+2 ===》1 是网关 1是广播

   私有地址: 192.168.x.x 局域网地址。

  sudo vim  /etc/network/interfaces

  sudo /etc/init.d/networking restart     

  sudo reboot

   192.168.0.0

   192.168.0.1  route

   192.168.0.255 boardcast

   801.n.g

   单机上网的配置:

   1、有网络接口并插入网线。

   2、有ip地址

   3、配置网络设置

            ip: ifconfig ethX X.X.X.X/24 up  ifconfig ens33 192.168.0.13/24 up  255.255.255.0

            网关: route add default gw x.x.x.x

            DNS:  vi /etc/resolv.conf  ==>nameserver 8.8.8.8

            测试:ping www.baidu.com 

            netstat  -anp

2、网络接口

   1、socket  套接字 ==》BSD socket ==》用于网络通信的一组接口函数。socket api  application interface

   2、ip+port 地址+端口===》地址用来识别主机

                              端口用来识别应用程序

         port分为TCP port / UDP port  范围都是: 1-65535

         约定1000 以内的端口为系统使用。

            http 80   www.baidu.com

                3306

                telnet 21

                ssh 22

3、网络字节序 ===》大端存储

       12 00   小端   0x12345678

       00 12

       192.168.0.12

       12.0.168.192

       00 12

   数字转换函数:

   #include <arpa/inet.h>

   1236234687

   主机转网络:uint32_t htonl(uint32_t hostlong);

   ipv4 192.168.0.1 1~65535

                uint16_t htons(uint16_t hostshort);

   网络转主机:host to net

                net to host

                uint32_t ntohl(uint32_t netlong);

                uint16_t ntohs(uint16_t netshort);

   字符串转换函数:

   #include <sys/socket.h>

   #include <netinet/in.h>

   #include <arpa/inet.h>

   主机转网络:in_addr_t inet_addr(const char *cp);

   inet_addr("192.168.1.20");

   cli.sin_addr

   网络转主机:char *inet_ntoa(struct in_addr in);

client, server

browser

b/s  http  

p2p   peer

TCP

1、模式  C/S 模式  ==》服务器/客户端模型

server:socket()-->bind()--->listen()-->accept()-->recv()-->close()

client:socket()-->connect()-->send()-->close();

int on = 1;
setsockopt(listfd, SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));

服务器端:

#include <sys/types.h>          /* See NOTES */

#include <sys/socket.h>

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

功能:程序向内核提出创建一个基于内存的套接字描述符

参数:domain  地址族,PF_INET == AF_INET ==>互联网程序

                      PF_UNIX == AF_UNIX ==>单机程序

     type    套接字类型:

              SOCK_STREAM  流式套接字 ===》TCP  

              SOCK_DGRAM   用户数据报套接字===>UDP

              SOCK_RAW     原始套接字  ===》IP

     protocol 协议 ==》0 表示自动适应应用层协议。

返回值:成功 返回申请的套接字id

       失败  -1;

2、int bind(int sockfd, struct sockaddr *my_addr,

             socklen_t addrlen);

功能:如果该函数在服务器端调用,则表示将参数1相关

     的文件描述符文件与参数2 指定的接口地址关联,

     用于从该接口接受数据。

     如果该函数在客户端调用,则表示要将数据从

     参数1所在的描述符中取出并从参数2所在的接口

     设备上发送出去。

     注意:如果是客户端,则该函数可以省略,由默认

           接口发送数据。

参数:sockfd 之前通过socket函数创建的文件描述符,套接字id

     my_addr 是物理接口的结构体指针。表示该接口的信息。

     struct sockaddr      通用地址结构

     {

         u_short sa_family;  地址族

         char sa_data[14];   地址信息

     };

     转换成网络地址结构如下:

     struct _sockaddr_in    ///网络地址结构

     {

         u_short           sin_family; 地址族

         u_short           sin_port;   ///地址端口

         struct in_addr  sin_addr;   ///地址IP

         char              sin_zero[8]; 占位

     };

     struct in_addr

     {

         in_addr_t s_addr;

     }

     socklen_t addrlen: 参数2 的长度。

返回值:成功 0

       失败  -1;

3、  int listen(int sockfd, int backlog);

    功能:在参数1所在的套接字id上监听等待链接。

   参数:sockfd  套接字id

         backlog 允许链接的个数。

   返回值:成功  0

            失败  -1;

4、int accept(int sockfd, struct sockaddr *addr,

                socklen_t *addrlen);

   功能:从已经监听到的队列中取出有效的客户端链接并

             接入到当前程序。

   参数:sockfd 套接字id

            addr  如果该值为NULL ,表示不论客户端是谁都接入。

              如果要获取客户端信息,则事先定义变量

               并传入变量地址,函数执行完毕将会将客户端

               信息存储到该变量中。

        addrlen: 参数2的长度,如果参数2为NULL,则该值

                    也为NULL;

                 如果参数不是NULL,&len;

                  一定要写成len = sizeof(struct sockaddr);

   返回值:成功 返回一个用于通信的新套接字id;

                从该代码之后所有通信都基于该id

          失败  -1;

5、接受函数:/发送函数:

   read()/write ()   ///通用文件读写,可以操作套接字。

   recv(,0) /send(,0)      ///TCP 常用套机字读写

   recvfrom()/sendto() ///UDP 常用套接字读写

ssize_t recv(int sockfd, void *buf, size_t len,

             int flags);

功能:从指定的sockfd套接字中以flags方式获取长度

     为len字节的数据到指定的buff内存中。

参数:sockfd 

       如果服务器则是accept的返回值的新fd

       如果客户端则是socket的返回值旧fd

     buff 用来存储数据的本地内存,一般是数组或者

     动态内存。

     len 要获取的数据长度

     flags 获取数据的方式,0 表示阻塞接受。

返回值:成功 表示接受的数据长度,一般小于等于len

       失败  -1;

6、close()  ===>关闭指定的套接字id;

===================================================

客户端:

1、int connect(int sockfd, const struct sockaddr *addr,

                   socklen_t addrlen);

   功能:该函数固定有客户端使用,表示从当前主机向目标

             主机发起链接请求。

   参数:sockfd 本地socket创建的套接子id

            addr 远程目标主机的地址信息。

        addrlen: 参数2的长度。

   返回值:成功 0

               失败 -1;

2、int send(int sockfd, const void *msg,

       size_t len, int flags);

   功能:从msg所在的内存中获取长度为len的数据以flags

             方式写入到sockfd对应的套接字中。

   参数:sockfd:

                如果是服务器则是accept的返回值新fd

            如果是客户端则是sockfd的返回值旧fd

        msg 要发送的消息

        len 要发送的消息长度

        flags 消息的发送方式。

  返回值:成功  发送的字符长度

         失败  -1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值