======================
No.1 网络编程基础
1.1 网络
多个主机连到一起,就形成了网络。
1.2 主机
并非必须得是一台计算机,共享单车、共享充电宝、路由器、空调、智能开关等都是主机,只要具备网络功能的计算机都是主机。具有网络模块的芯片也算是一个主机。
1.3 C/S B/S
- 服务器:提供指定服务的机器(功能单一)
- 客户端:界面 用来和用户交互
- C/S: Clinet/Server 客户端/服务器 (单一)
- B/S: Browser/Server 浏览器/服务器 (繁杂)
1.4 网络分层
- 应用:
ftp http https smtp ppppoe这种协议 - 传输:
数据的具体传输方式 Tcp(中心化)/Udp(去中心化) - 网络:
ip 往哪里发 - 数据链路:加密 翻译 编解码
字节 - 物理:硬件(网卡)
硬件层次传电信号或者光信号(光纤,光缆,双绞线)
1.4 协议
约定的规则
- 公有协议:全世界通用的标准 tcp udp http 公历纪元
- 私有协议:某些公司或者个人制定的标准
1.5 ip
- IP地址 协议 ipv4 ipv6
区分网络中的主机,本质就是一个整数
1.6 端口
- 一台主机为了区分不同应用(不同进程)所以有多个网络端口,同一时刻,有且只能一个进程使用某个端口进行通信。
No.2 TCP
tcp协议编程模型
Server Client
1. 创建socket 1. 创建socket
socket 返回一个描述符号(类似文件描述符号)
2. 确定服务器协议地址簇 2. 获取服务器协议地址簇
struct sockaddr
3. 绑定
bind
4. 监听
listen
5. 接收客户端连接 3. 连接服务器
accept connect
6. 通信 4. 通信
recv send
7. 断开连接 5. 断开连接
close
- 建立稳定全双工稳定数据传输通道:
- 打电话 直播 一直不间断的
- 发短信 断断续续的
- 全双工:双向同时进行
#include <sys/types.h>
#include <sys/socket.h>
int socket(
int domain,
int type,
int protocol);
Client
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<signal.h>
int clinentSocket;
int serverFd;
void handler(int num)
{
if(num==2)
{
close(serverFd);
close(clinentSocket);
printf("关闭客户端!\n");
exit(0);
}
}
int main(int argc,char* argv[])
{
signal(2,handler);
if(argc!=3) printf("cmd err!\n"),exit(0);
serverFd = socket(AF_INET,SOCK_STREAM,0);
if(-1==serverFd) printf("创建socket失败:%m\n"),exit(-1);
printf("创建socket成功!%m\n");
struct sockaddr_in addr = {0};
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(argv[1]);
addr.sin_port = htons(atoi(argv[2]));
int r = connect(serverFd,(struct sockaddr*)&addr,sizeof addr);
if(-1==clinentSocket) printf("连接服务器失败:%m\n"),close(serverFd),exit(-1);
printf("连接服务器成功!%m\n");
char buff[256];
while(1)
{
memset(buff,0,256);
r = 0;
printf("请输入>>");
scanf("%s",buff);
r = send(serverFd,buff,strlen(buff),0);
if(r<0)
{
printf("发送失败!\n");
}
}
return 0;
}
Server
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<signal.h>
int clinentSocket;
int serverFd;
void handler(int num)
{
if(num==2)
{
close(serverFd);
close(clinentSocket);
printf("关闭服务器!\n");
exit(0);
}
}
int main(int argc,char* argv[])
{
signal(2,handler);
if(argc!=3) printf("cmd err!\n"),exit(0);
serverFd = socket(AF_INET,SOCK_STREAM,0);
if(-1==serverFd) printf("创建socket失败:%m\n"),exit(-1);
printf("创建socket成功!%m\n");
struct sockaddr_in addr = {0};
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(argv[1]);
addr.sin_port = htons(atoi(argv[2]));
int r = bind(serverFd,(struct sockaddr*)&addr,sizeof addr);
if(-1==r) printf("绑定失败:%m\n"),close(serverFd),exit(-1);
printf("绑定成功!%m\n");
r = listen(serverFd,10);
if(-1==r) printf("监听失败:%m\n"),close(serverFd),exit(-1);
printf("监听成功!%m\n");
clinentSocket = accept(serverFd,NULL,NULL);
if(-1==clinentSocket) printf("接受客户端连接失败:%m\n"),close(serverFd),exit(-1);
printf("接受客户端连接成功!%m\n");
char buff[256];
while(1)
{
r = recv(clinentSocket,buff,255,0);
if(r>0)
{
buff[r] = 0;
printf("<< %s\n",buff);
}
}
return 0;
}
No.3 UDP
|