linux 网络编程

linux网络开发

网络发展历史和分层

网络采用分层的思想:

  1. 每一层实现不同的功能,对上层的数据做透明传输
  2. 每一层向上层提供服务,同时适用下层提供的服务

各层典型的协议:

网络接口与物理层
MAC地址:48位全球唯一,网络设备的身份标识
ARP/RARP
ARP:IP地址----->MAC地址
RARP:MAC地址---》IP地址

PPP协议:拨号协议(GPRS/3G/4G)
网络层:
IP
ICMP
IGMP
传输层:
TCP
UDP

TCP/UDP特点

网络编程的预备知识

Socket 简介

socket

  • 是一种应用的编程接口
  • 是一种特殊的文件描述符 (对它执行IO的操作函数,比如,read(),write(),close()等操作函数)
  • 并不仅限于TCP/IP协议
  • 面向连接
  • 无连接

socket类型

流式套接字(SOCK_STREAM) 唯一对应着TCP

  • 提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。

数据报套接字(SOCK_DGRAM) 唯一对应着UDP

  • 提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。

原始套接字(SOCK_RAW) (对应着多个协议,发送穿透了传输层)

  • 可以对较低层次协议如IP、ICMP直接访问。

IP地址

  1. IP地址分为 IPV4和IPV6
  • IPV4:采用32位的整数来表示
  • IPV6:采用128位的整数来表示

IPV4:
点分形式:192.168.7.2
32位整数

特殊IP地址:
局域网IP:192.xxx.xxx.xxx 10.xxx.xxx.xxx
广播IP:xxx.xxx.xxx.255 255.255.255.255(全网广播)
组播IP:224.xxx.xxx.xxx~239.xxx.xxx.xxx

端口号:
16位的数字(1-65535)

  • 众所周知端口:1~1023(FTP:21,ssh:22,HTTP:80,HTTPS:469)
  • 保留端口:1024-5000(不建议使用)
  • 可以使用的端口:5001~65535
    TCP端口与UDP端口相互独立
    网络里面的通信是由 IP地址+端口号 来决定的

字节序

字节序是指不同的CPU访问内存中的多字节数据时候,存在大小端问题。
如果CPU访问的是字符串,则不存在大小端问题。
大小端:
小端:低对低,低端数据对应低端
大端:低对高,低端内存对应高端数据
一般来说:
X86/ARM:小端
powerpc/mips,ARM作为路由器时,大端模式

网络传输的时候采用大端模式

本地字节序、网络字节序

字节序转换函数

主机字节序到网络字节序
  • u_long htonl (u_long hostlong);
  • u_short htons (u_short short);
网络字节序到主机字节序
  • u_long ntohl (u_long hostlong);
  • u_short ntohs (u_short short);
IP地址转换函数

in_addr_t inet_addr(const char *cp);
cp:点分形式的IP地址,结果是32位整数(内部包含了字节序的转换,默认是网络字节序的模式)
特点:

  1. 仅适应与IPV4
  2. 当出错时,返回-1
  3. 此函数不能用于处理255.255.255.255的转换问题
#include <arpa/inet.h>
int inet_pton(int af,const char *src,void *dst);

特点: 1.适应与IPV4和IPV6
2.能正确处理255.255.255.255的转换问题
参数:

  1. af:地址协议族(AF_INET或AF_INET6)
  2. src:是一个指针(填写点分形式的IP地址[主要指IPV4])
  3. dst:转换的结果给到dst

TCP网络编程API

  1. socket()函数
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

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

参数:

  • domain:
    AF_INET IPv4 Internet protocols
    AF_INET6 IPv6 Internet protocols

  • type:
    SOCK_STREAM:流式嵌套接字 唯一对应TCP
    SOCK_DGRAM:数据报套接字 唯一对应着UDP
    SOCK_RAW:原始套接字

  • protocol 一般填0;

  1. bind()函数

  2. listen()函数

  3. accept()函数,阻塞等待客户端连接请求

  4. 客户端连接函数 connect()

connect函数和bind()函数写法类次

posted @ 2022-06-08 21:18  0402  阅读(34)  评论(0编辑  收藏  举报