Linux系统编程-DAY09(网络编程)

网络编程 :
一、open system interconnect
1、OSI 模型  ===》开放系统互联模型  ==》分为7层:
理想模型  ==》尚未实现

应用层: ./a.out
表示层: 加密解密  gzip
会话层: 网络断开,连接状态,keep-close keep-alive
传输层:tcp  udp  协议  文件    视频,音频
    tcp:高成本发送数据(在网络中一种可靠的传输方式),缺点:网络延迟有点大,网络开销大
    udp:是一种不可靠传输方式
    传文件一般使用tcp
网路层:ip   NAT
链路层:交换机  数据的格式化  帧 校验
物理层:100Mb/8  Gbits   100MB 同轴电缆 10Gb    2.4G 5G

应用层:为网络用户提供各种服务,例如电子邮件、文件传输等。
表示层:为不同主机间的通信提供统一的数据表示形式。
会话层:负责信息传输的组织和协调,管理进程会话过程。
传输层:管理网络通信两端的数据传输,提供可靠或不可靠的传输服务。
网络层:负责数据传输的路由选择和网际互连。
数据链路层:负责物理相邻(通过网络介质相连)的主机间的数据传输,主要作用包括物理地址寻址、数据帧封装、差错控制等。该层可分为逻辑链路控制子层(LLC)和介质访问控制子层(MAC)。
物理层:负责把主机中的数据转换成电信号,再通过网络介质(双绞线、光纤、无线信道等)来传输。该层描述了通信设备的机械、电气、功能等特性。

TCP/IP模型  ==》网际互联模型   ==》分为4层:
   实用模型  ===》工业标准
   tcp/ip协议栈
应用层   ====》应用程序
传输层   ====》端口号tcp udp
网络层   ====》IP 地址
接口层   ====》网卡 驱动  1GB

二、TCP/IP协议族:
www.taobao.com ---> 192.168.0.19
www.voa.com vpn  
dns 域名解析
DHCP
应用层: HTTP TFTP FTP SNMP DNS ...
传输层: TCP  UDP   
网络层: IP  ICMP(ping) RIP OSPF IGMP ...(IP:互联网协议、ICMP互联网管理协议,用于做网络检测和诊断用、RIP 最短路径、OSPF 最佳路径、IGMP)
物理层: ARP  RARP  ...   ip--->mac  
    ARP:地址解析协议
    小范围局域网寻址时用mac地址;

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

三、TCP编程基础知识:

1、网络基础  ---> A B C D E 类
IP地址 == 网络位 + 主机位
IP地址的分类: 点分十进制   ipv4  
A类: 超大规模性网络
    第一位是网络号
B类: 大中规模型网络
    前俩位是网络号
C类: 中小规模型网络
    前三位网络号,最后一位是主机编号
D类: 组播和广播
    组播:在局域网范围内,一对多
E类: 实验

ip: ifconfig 
测试: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(自己写程序建议大于50000以上
    约定1000以内的端口号为系统使用。

3.网络字节序---> 大端存储  (又叫主机字节序)

4.在网络通信中,是客户端找服务器
    bind()方便客户端寻找
fd = socket() --->  bind --->  recvfrom ---> sendto
    1>int socket(int domain, int type, int protocol); (套接字可以创建多个)
    2>man 7 ip  
    小端转大端:(1)htons(host to net short)
            (2)inet addr(“192.168.0.111”)
    3>recvfrom: ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);
    4>sendto: ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);


四、网络编程之 UDP  用户数据报
1、特性: 无链接  不可靠  大数据   
2、框架: C/S模式 
   server:socket() ===>bind()===>recvfrom()===>close()
   client:socket() ===>bind()===>sendto() ===>close()(大部分情况下不调bind)
    客户端发送的太快,服务端来不及接收,可能会出现丢包的情况。
    数据和数据之前是有边界的,recvfrom填的值可以比收到的值大一点
3.UDP没有拥塞控制、只有UDP才可以发组播和广播、UDP首部开销比较小

五、练习与例题
        udp连接:
1.ser.c

#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <time.h>
typedef struct sockaddr *(SA);
int main(int argc, char *argv[]) {
  int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  if (-1 == sockfd) {
    perror("socket");
    return 1;
  }
  struct sockaddr_in ser, cli; // client  man 7 ip
  bzero(&ser, sizeof(ser));
  bzero(&cli, sizeof(cli));
  ser.sin_family = AF_INET;
  ser.sin_port = htons(50000);                        // host to net short
  ser.sin_addr.s_addr = inet_addr("192.168.0.119"); // 小端转大端
  int ret = bind(sockfd, (SA)&ser, sizeof(ser));
  if (-1 == ret) {
    perror("bind");
    return 1;
  }
  socklen_t len = sizeof(cli);
  while (1) {
    char buf[256] = {0};
    char buf1[256] = "手机是不是没电了";
    recvfrom(sockfd, buf, sizeof(buf), 0, (SA)&cli, &len);
    time_t tm;
    time(&tm);
    struct tm *tminfo = localtime(&tm);

    sprintf(buf, "%s %d:%d:%d %s\n", buf, tminfo->tm_hour, tminfo->tm_min,
            tminfo->tm_sec, buf1);
    sendto(sockfd, buf, strlen(buf), 0, (SA)&cli, sizeof(cli));
  }

  return 0;
}

2.cli.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */ 
#include <arpa/inet.h>
#include <time.h>
#include <unistd.h>
typedef struct sockaddr * (SA);
int main(int argc, char *argv[])
{
    int sockfd  = socket(AF_INET,SOCK_DGRAM,0);
    if(-1 == sockfd)
    {
        perror("socket");
        return 1;
    }
    struct sockaddr_in ser,cli;//client  man 7 ip 
    bzero(&ser,sizeof(ser));
    bzero(&cli,sizeof(cli));
    ser.sin_family  = AF_INET;
    ser.sin_port = htons(50000); // host to net short 
    ser.sin_addr.s_addr = inet_addr("192.168.0.151");// 小端转大端
    socklen_t len = sizeof(cli);
    while(1)
    {
        char buf[256]={0};
        strcpy(buf,"this is udp test");
        sendto(sockfd,buf,strlen(buf),0,(SA)&ser,sizeof(ser));
        bzero(buf,sizeof(buf));
        recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);
        printf("server:%s",buf);
        sleep(1);
    }
    close(sockfd);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值