网络编程套接字

IP地址:唯一定位网络上的一台主机
        无符号四个字节的整数    ---uint32_t
端口:标识一台主机上网络通信的进程
      无符号两个字节的数据 ---uint16_t   0-65535
      进程的标识为什么不用pid?    进程的PID会随着进程的创建而改变
sip + sport + dip + sport + proto   一条信息的五元组(用于标识网络上的一条通信)
 数据起点       数据终点     协议
网络字节序:大小端
    大端字节序:低地址存高位
    小端字节序:低地址存地位
    不同字节序主机之间进行数据传输,将造成数据的逆序,也就说得不到人家真正发送数据,怎么办?
    在网络间进行通信的时候必须使用大端字节序---网络字节序
    也就意味着我们的主机是小端字节序,那么通信的时候就需要对数据逆序,但是并不是所有数据都逆序,主要针对在内存中存储时,
    占据字节大于一个字节的数据
    int short long float double 针对这些类型的数据,因为在内存中的存储更展示的刚好顺序相反,而发送时候,按字节发送,对方按字节接收,
    那么对方如果是大端,因为低地址存高位,因为存储顺序和使用顺序完全相同,导致数据跟实际想发送的数据顺序刚好相反,因此需要进行字节逆序转换。
    主机字节序:就是当前主机的字节序---大小端不一定,取决于cpu的架构
网络层套接字编程:socket是一套操作系统提供的接口——供用户进行网络通信编程。
    主要说的是传输层tcp/udp
    因为传输层有两个典型协议分别是tcp和udp,我们必须选择其一进行数据传输,选哪个尼?
    这时候我们必须明了两个协议的有缺点,视使用场景而定。
    tcp:面向连接,可靠传输,字节流服务
         面向连接,可靠传输:数据的可靠传输;字节流传输;数据传输灵活
         优点:可靠传输,并且传输灵活;缺点;传输速度较低,数据粘包
    udp:无连接,不可靠,面向数据报
       优点:传输速度快,无粘包;
       缺点:不可靠
    针对数据安全性要求高的场景(文件传输)使用tcp保证数据的可靠
    针对数据安全性要求不是很高,但是实时性要求高的场景(视频传输)用udp保证速度
socket套接字编程:
    网络编程涉及到对网卡的操作,因此操作系统提供了一套接口来供我们操作--socket接口
    网络编程中分了两个端:客户端程序/服务端程序
    在网络编程中,客户端就是主动的一方,客户端必须知道服务端的地址信息(ip+port),并且服务端还必须得在这个指定的地址上等着别人。
 udp编程步骤:
    服务端:
      创建套接字
         建立网卡与进程间的关系
      为套接字绑定地址信息
         圈定要操作的网卡上的那些数据
         为套接字绑定地址端口,就是为了声明去网卡接收数据的时候,接收的是那一部分数据(因为网卡上会有很多的数据)。
      发送或接收数据
      关闭套接字
   客户端:

      创建套接字
      绑定(不主动绑定)
      发送/接收数据
      关闭套接字
    socket()    bind()    sendto()/rse ()  close()
      客户端建议不要手动绑定地址信息,因为绑定了有可能绑定失败,因此,最好把绑定的过程交给操作系统完成,因为操作系统会选择一个
    当前合适的地址信息进行绑定,这样做可以将失败的可能性降至最低
      服务端必须绑定地址,因为服务端是被动的一端,必须告诉别人需要将数据发送到哪个地址哪个端口,因此自己就必须接收这个地址这个端口的数据
 tcp编程步骤:
    服务端:创建套接字->绑定套接字->开始监听(建立一个新的socket,单独与新客户进行通信)->获取这个新创建的socket->收发数据->关闭套接字
    客户端:创建套接字->向服务器端发起连接请求->收发数据->关闭套接字
     listen的第二参数:一个整形数字
           用于定义一个挂起的连接队列最大节点数,表示同一时间的并发连接数(同一时间能够接受多少个客户端连接)
     int listen(int socket , int backlog);
         socket :套接字描述符
         backlog: 定义已完成连接队列的最大节点数,每一个新客户端都会创建新的socket,一个新连接建立连接有一个过程,如果这个新的连接已经
                   完成三次握手过程,如果这个新的socket放到这个队列中,这个backlog决定了同一时间的最大并发连接数
     accept的理解:
         每一个客户端向服务器端发起连接请求,在服务器端都会新建一个socket结构,当这个新的连接走完三次握手过程,完成建立连接,这个新的
     socket结构会放到已完成队列中。
         accept获取新连接的客户端,实际上是从已完成队列获取一个已完成连接的socket,并且返回这个新的socket的套接字描述符。
     int accept(int socket,struct sockaddr *addr , socklen_t *addrlen);
         addr:新连接客户端地址信息
         addrlen:用于确定要获取地址信息的长度,接收实际长度
         返回值:新建的socket连接的套接字描述符,失败 -1
     多进程版本:缺点:1.当连接发送请求是才创建,耗费时间
                      2.连接非常多时系统会存在很多进程,CPU调度成本增加
                      3.占用资源非常多,导致客服务客户数降低
                 优点:可靠性较强
     多线程版本:缺点:没有多进程可靠性高
                 优点:相对于多进程版本会延缓CPU创建进程较小
   netstat -apnt  抓取TCP数据包
   telnet 连接服务器
   ps -aL | head -1 && ps -aL | grep tcp_serv
        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值