网络编程(2)
TCP服务器代码优化,网络模型,域名,虚拟机网络,网络调试,UDP编程
目录
1.TCP服务器代码优化
1.1命令行传参
通过命令行传入IP和端口号,并加入判错
执行效果
1.2判错方式
#define ERR_MSG(msg) do{\
fprintf(stderr, "line:%d ", __LINE__);\
perror(msg);\
}while(0)
使用示例:
报错示例演示(绑定ip为一错误ip,bind肯定会报错)
1.3自动绑定IP地址
执行效果
1.4来电显示功能
效果演示
1.(使用Windows上的调试助手模拟客户端)
- 本地回环测试(使用虚拟机调试助手模拟客户端)
1.5循环服务器
一对一连接,一个客户端退出后,下一个客户端可以进行连接。
服务器端
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#define ERR_MSG(msg) \
do \
{ \
fprintf(stderr, "line:%d ", __LINE__); \
perror(msg); \
} while (0)
int main(int argc, char const *argv[])
{
if (argc != 2)
{
printf("usage:<port>\n");
return -1;
}
// 1.创建套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
printf("sockfd:%d\n", sockfd);
// 2.bind绑定ip和port
struct sockaddr_in saddr, caddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(atoi(argv[1]));
// saddr.sin_addr.s_addr=inet_addr(argv[1]);
socklen_t addrlen = sizeof(saddr);
#if 0
saddr.sin_addr.s_addr=inet_addr("0.0.0.0");
#else
saddr.sin_addr.s_addr = INADDR_ANY;
#endif
if (bind(sockfd, (struct sockaddr *)&saddr, addrlen) < 0)
{
ERR_MSG("bind");
return -1;
}
printf("bind ok\n");
// 3.监听 listen将主动套接字变为被动套接字
if (listen(sockfd, 6) < 0)
{
perror("listen err");
return -1;
}
while (1)
{
// 4.accept阻塞等待连接可以建立,有的话就解除阻塞建立连接,并产生一个新的套接字
int acceptfd = accept(sockfd, (struct sockaddr *)&caddr, &addrlen);
if (acceptfd < 0)
{
perror("accept err");
return -1;
}
printf("acceptfd:%d \n", acceptfd);
printf("ip:%s port:%d\n", inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));
// 5.发送
#define N 64
char buf[N] = {};
while (1)
{
memset(buf, 0, N);
int ret = recv(acceptfd, buf, N, 0);
if (ret < 0)
{
perror("recv err");
return -1;
}
else if (ret == 0)
{
printf("%s out\n",inet_ntoa(caddr.sin_addr));
close(acceptfd);
break;
}
else
{
printf("buf:%s\n", buf);
}
}
}
close(sockfd);
return 0;
}
2.网络模型
2.1网络的体系结构
- 网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起。
- 每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层提供的服务
- 网络体系结构即指网络的层次结构和每层所使用协议的集合
- 两类非常重要的体系结构:OSI与TCP/IP
分层的好处:
- 各层之间独立,每一层不需要知道下一层如何实现,而仅仅只需要知道该层通过层间的接口所提供的的服务。
- 稳定,当任何一层发生变化时,只要层间接口关系保持不变,则这层以上或以下层不受影响。
- 易于实现和维护(知道是什么功能,就到指定层去查找)
- 促进标准化工作
2.2OSI模型
- OSI模型是一个理想化的模型,尚未有完整的实现
- OSI模型共有七层
- OSI现阶段只用作教学和理论研究
2.3TCP/IP模型
在网络中传输的数据,不仅仅有用户发送的数据,还包含着其他的必要信息,比如对端的IP和端口号
应用层:应用协议和应用程序的集合。
传输层:端到端 ,写入源端口和目的端口决定数据交给机器的哪个任务(进程)去处理,通过端口寻址
网络层:提供设备对设备的传输,可以理解为通过IP寻找机器。
网络接口和物理层:屏蔽硬件差异(驱动),向上层提供统一的操作接口,网线。
OSI和TCP/IP模型对应关系图
2.4常见网络协议
网络接口和物理层:
ppp:拨号协议(老式电话线上网方式)
ARP:地址解析协议 IP-->MAC
RARP:反向地址转换协议 MAC-->IP
网络层:
IP(IPV4/IPV6):网间互连的协议
ICMP:网络控制管理协议,ping命令使用
IGMP:网络分组管理协议,广播和组播使用
传输层:
TCP:传输控制协议
UDP:用户数据报协议
应用层:
SSH:加密协议
telnet:远程登录协议
FTP:文件传输协议
HTTP:超文本传输协议
Modbus_Tcp
DNS:地址解析协议
SMTP/POP3:邮件传输协议
注意:TCP和IP是属于不同协议栈层的,只是这两个协议属于协议族里最重要的协议,所以协议栈或者模型以之命名了。
3.域名
3.1域名系统DNS
由于使用IP地址来指定计算机不方便人们记忆,且输入时候容易出错,用字符标识网络中计算机名称方法。
这种命名方法就像每个人的名字,这就是域名(Domian Name )
域名服务器(Domain Name server):用来处理IP地址和域名之间的转换。
域名系统(Domain Name System,DNS):域名翻译成IP地址的软件DNS
3.2域名结构
例如域名 www.baidu.com.cn 从右向左看
cn为高级域名,也叫一级域名,它通常分配给主干节点,取值为国家名,cn代表中国
com为网络名,属于二级域名,它通常表示组织或部门
中国互联网二级域名共40个,edu表示教育部门,com表示商业部门,gov表示政府,军队mil等等
baidu为机构名,在此为三级域名,表示百度
www:万维网world wide web,也叫环球信息网,是一种特殊的信息结构框架。
DNS工作流程
DNS黑客技术
4.虚拟机网络
4.1虚拟机NAT模式
宿主主机打开一个虚拟机
宿主主机打开多个虚拟机
Net模式下,虚拟机的IP由宿主主机分配,不定。
虚拟机的IP网段不定,甚至会分配到同一个ip,每个虚拟机都由宿主虚拟出来的DHCP服务器分配IP,互相不能通信。
4.2虚拟机桥接模式
桥接模式下,虚拟机的ip由路由器分配,所以虚拟机在路由器网关的地位就相当于和宿主主机处于并列地位,故正常主机有的通信功能它都会有。
4.3虚拟机网络修复
5.网络调试
5.1ping
作为平时网络连通检测使用最多的命令,它的作用主要为:
● 用来检测网络的连通情况;
● 根据域名得到服务器IP;
● 根据ping返回的TTL值来判断数据包经过路由器数量。
字节:数据包大小,也就是字节。
时间:响应时间,这个时间越小,说明你连接这个地址速度越快。
TTL:Time To Live,从源到目的,每经过一个路由器,TTL减1,当TTL=0,包丢掉。(TTL的初值跟操作系统挂钩,TTL初值根据操作系统的具体版本不同会有所区别)
5.2路由探测
tracert www.baidu.com
5.3网速检测
测速网 - 专业测网速, 网速测试, 宽带提速, 游戏测速, 直播测速, 5G测速, 物联网监测,Wi-Fi 7,Wi-Fi 6,FTTR,全屋Wi-Fi - SpeedTest.cn
5.4手机客户端
可以直接从手机应用市场搜索"全能调试王"下载,也可以从下面网址下载
全能调试软件下载-全能调试app下载v1.0.5官方版-西西软件下载 (cr173.com)
5.5netstat
netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP相关的统计数据,一般用于检验本机各端口的网络连接情况。
作用:测试网络状态
netstat -a //查看所有网络连接状态
netstat -at //查看tcp所有网络状态
netstat -au //查看udp所有网络状态
可以使用联合命令查询
netstat -at | grep 8888
代表查看所有端口和8888有关的TCP连接状态
6.UDP编程
不同:
TCP面向连接,可靠 ,速度慢
UDP无连接不可靠,速度快
6.1通信流程
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
功能:接收数据
参数:
sockfd:套接字描述符
buf:接收缓存区的首地址
len:接收缓存区的大小
flags:0
src_addr:发送端的网络信息结构体的指针
addrlen:发送端的网络信息结构体的大小的指针
返回值:
成功接收的字节个数
失败:-1
0:客户端退出
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
功能:发送数据
参数:
sockfd:套接字描述符
buf:发送缓存区的首地址
len:发送缓存区的大小
flags:0
src_addr:接收端的网络信息结构体的指针
addrlen:接收端的网络信息结构体的大小
返回值:
成功发送的字节个数
失败:-1
更多推荐
所有评论(0)