Next 6 网络编程、UDP 用户数据报
数据链路层:负责物理相邻(通过网络介质相连)的主机间的数据传输,主要作用包括物理地址寻址、数据帧封装、差错控制等。物理层:负责把主机中的数据转换成电信号,再通过网络介质(双绞线、光纤、无线信道等)来传输。网络层:IP ICMP(互联网网络诊断协议) (ping) RIP(最佳路径) OSPF(最短路径) IGMP。功能:从指定的sockfd套接字中以flags方式获取长度,为len字节的数据到指定
网络通信依然数据,进程间通信的范畴。网络通信是不同主机间的进程间通信。
一、IOS模型、TCP模型
1、IOS 模型
===》开放系统互联模型 ==》分为7层:
理想模型==》尚未实现
tftp
b /etc/passwd
a /etc/123
应用层: 例如电子邮件、文件传输、http协议
表示层 :加密解密 gzip
会话层 :网络断开,连接状态,keep-closekeep-alive
传输层 :tcp udp 协议 文件视频,音频
网路层 :ipNAT
链路层 :交换机 数据的格式化 帧 校验
物理层 :100Mb/8 Gbits 100MB 同轴电缆 10Gb 2.4G 5G(网线、光纤)
应用层:为网络用户提供各种服务,例如电子邮件、文件传输等。
表示层:为不同主机间的通信提供统一的数据表示形式。
会话层:负责信息传输的组织和协调,管理进程会话过程。
传输层:管理网络通信两端的数据传输,提供可靠或不可靠的传输服务。
网路层:负责数据传输的路由选择和网际互连。
数据链路层:负责物理相邻(通过网络介质相连)的主机间的数据传输,主要作用包括物理地址寻址、数据帧封装、差错控制等。该层可分为逻辑链路控制子层(LLC)和介质访问控制子层(MAC)。
物理层:负责把主机中的数据转换成电信号,再通过网络介质(双绞线、光纤、无线信道等)来传输。该层描述了通信设备的机械、电气、功能等特性。
2、TCP/IP模型(sudo reboot重启配置文件)
tcp/ip模型,是从osi模型简化而来。
国际互联网模型==》分4层:
实用模型===》工业标准
tcp/ip协议栈
应用层====》应用程序
传输层====》端口号 tcp udp
网络层====》IP地址
接口层====》网卡驱动 1GB
3、常用网络协议
TCP/IP协议族:
www.taobao.com--->192.168.0.19
www.voa.com vpn
dns 域名解析
DHCR. 动态主机配置协议
应用层:HTTP TFTP(简单文件传输协议,近程) FTP(文件传输协议,远程) SNMP DNS...
传输层:TCP(传输控制协议) UDP(用户数据报协议) 56k猫
网络层:IP ICMP(互联网网络诊断协议) (ping) RIP(最佳路径) OSPF(最短路径) IGMP
接口层:ARP RARP... ip--->mac 地址解析
arp...
192.160.0.112
二、IP地址
0103333344444
IP地址==网络位+主机位
IP地址的分类:点分十进制 ipv4 712934
A类:超大规模性网络
8888
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(前2个号做主机号)
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.00-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
三、网络常用命令:
1、有网络接口并插入网线。
2、有ip地址(ifconfig)
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
ifconfig:查看网络适配器的状态信息,查看自己的ip。
netstat -anp:查看本机所有的网络连接的状态。
四、网络接口:
1、socket 套接字(底层实现是队列)套接字,网络设备对应的文件描述符。
==》BSD socket ==》用于网络通信的一组接口函数。
socket API application interface
2、ip+port地址+端口===》
地址用来识别主机;端口用来识别应用程序
port分为TCP port/UDP port 范围都是:1-65535
约定1000以内的端口为系统使用。
3、网络字节序 ===》大端存储 网络设备都是大端存储;主机字都是小端存储
五、用户数据报UDP
数字转换函数:
#includee<arpa/inet.h>
1236234687
主机转网络:uint32_thtonl(uint32_thost long);
ipv4192.168.0.11~65535
uint16_t htons(uint16_t host short);
网络转主机:host tonet
net to host
uint32_t ntohl(uint32_t net long);
uint16_t ntohs(uint16_t net short);
sudo reboot
特性:无链接,不可靠,大数据,网络延迟小,开销小
字符串转换函数:
#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);

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 addr len);
功能:如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2 指定的接口地址关联,用于从该接口接受数据。如果该函数在客户端调用,则表示要将数据从
参数1所在的描述符中取出并从参数2所在的接口设备上发送出去。
注意:如果是客户端,则该函数可以省略,由默认 接口发送数据。
参数:sockfd 之前通过socket函数创建的文件描述符,套接字id。
my_addr 是物理接口的结构体指针。表示该接口的信息。
struct sockaddr ////通用地址结构
转换成网络地址结构如下:
struct _sockaddr_in.in_addr_t s_addr; ///网络地址结构
socklen_t addrlen: 参数2 的长度。
返回值:成功 0;失败 -1;
3、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 表示阻塞接受。
返回值:成功:表示接受的数据长度,一般小于等于le
// server 服务端
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <time.h>
typedef struct sockaddr * (SA);
int main(int argc, char **argv)
{
// 1. internet , udp, 默认协议
int udpfd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == udpfd)
{
perror("socket");
return 1;
}
// 2. 给套接字 绑定ip ,端口号
// man 7 ip 查询 ipv4 的地址结构体
struct sockaddr_in ser, cli; // 服务器的地址结构体, 客户端的地址结构体
bzero(&ser, sizeof(ser));
bzero(&cli, sizeof(cli));
ser.sin_family = AF_INET; // ipv4
ser.sin_port = htons(50000); // host to net short 小端转大端
ser.sin_addr.s_addr = inet_addr("192.168.14.128");
int ret = bind(udpfd, (SA)&ser, sizeof(ser));
if (-1 == ret)
{
perror("bind");
return 1;
}
socklen_t len = sizeof(cli);
while (1)
{
char buf[1024]={0};
recvfrom(udpfd,buf,sizeof(buf),0,(SA)&cli,&len);
time_t tm;
time(&tm);
sprintf(buf,"%s %s",buf,ctime(&tm));//相当于data命令
sendto(udpfd,buf,strlen(buf),0,(SA)&cli,len);
}
return 0;
}
// client 客户端
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <time.h>
typedef struct sockaddr *(SA);
int main(int argc, char **argv)
{
// 1. internet , udp, 默认协议
int udpfd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == udpfd)
{
perror("socket");
return 1;
}
// man 7 ip 查询 ipv4 的地址结构体
struct sockaddr_in ser; // 服务器的地址结构体, 客户端的地址结构体
bzero(&ser, sizeof(ser));
ser.sin_family = AF_INET; // ipv4
ser.sin_port = htons(50000); // host to net short 小端转大端
ser.sin_addr.s_addr = inet_addr("192.168.14.128");
while (1)
{
char buf[1024] = "hello,this is tcp test";
sendto(udpfd, buf, strlen(buf), 0, (SA)&ser, sizeof(ser));
bzero(buf, sizeof(buf));
recvfrom(udpfd, buf, sizeof(buf), 0, NULL, NULL);
printf("from ser:%s\n", buf);
sleep(1);
}
close(udpfd);
return 0;
}
数据报
1.发送次数和接收次数要对应。
2.发送和接收大小,保持一致。如果接收的大小小,剩下的数据就接收不到了(1包数据)。
3.每次发送数据,链路都是不同的。
4.对于udp而言,是有读阻塞。
5.没有写阻塞。发送方发送数据太快,接收发没有及时接收,就会出现丢包。
6.半双工
更多推荐

所有评论(0)