1.基础(ip)
1.1 网络工具
ping ---- 查看网络的连接
ifconfig -a --- 可以查看IP
lsof ---列出系统进程正在使用的文件
netstat -a/-u/-t/-x/-n/-tn ---------查看网路状态
route ------内核IP路由表
1.2 网路基础概念
网路编程采用socket模型。
网络通信的本质是进程之间的通信。
识别主机: 4个字节整数:IP地址
识别进程: 2个字节整数:端口号
IP地址的表示方法:
内部表示: 4个字节整数
外部表示: 数点字符串
IP地址的转换:
struct sockaddr_in
{
int sin_family;
in_prot port;
struct in_addr sin_addr;
};
struct in_addr
{
in_addr_t s_addr;
};
in_addr_t inet_addr( const char *cp); /// 把字符串转换成整数
int inet_aton( const char *cp, struct in_addr *inp); /// 把字符串转换成 struct in_addr 结构体
in_addr_t inet_network( const char *cp); 把字符串转换成整数
char * inet_ntoa( struct in_addr in); 把结构体转换成字符串
3.IP地址分为5类
A 1-126
B 128-191
C 192-223
D 224-239
E 目前还没用到,是给将来预留的!
146.35.128.1 属于B类!
1.5 计算机系统中的网络配置文件
————————————————
$ vi /etc/hosts -------配置IP,域名,主机名
$ vi /etc/protocols -------------配置系统支持的协议
$ vi /etc/services -------配置服务
2. TCP/UDP 编程
对等模型: AF_INET SOCK_DGRAM 0 .................... 报文
C/S 模型: AF_INET SOCK_STREAM 0 .................... 流
2.0 网络编程
计算机网络体系结构:
(1) OSI的7层协议 (2) TCP/IP的四层协议(3)五层协议
2.1 UDP编程的数据特点
UDP采用对等模型SCOK_DGRAM -------报文传输
socket
绑定IP地址 bind 连接目标(可选)
read/recv/recvfrom 发送数据write
关闭
案例:
A. 接收用用户的数据,打印数据与发送者的IP。
B. 发送数据,接收数据,并且打印
/// udpA.c 接收数据
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> // 这个头文件一定要加上,不认出现莫名的错误
main()
{
int fd; /// socket描述符
struct sockaddr_in ad; // 本机IP地址
char buf[100]; // 接收数据缓冲
struct sockaddr_in ad_snd; // 发送者的IP地址
socklen_t len; // 发送者IP的长度
int r;
fd = socket(AF_INET,SOCK_DGRAM,17); // 使用UDP协议
if(fd == -1) printf("socket:%m\n"),exit(-1);
printf("建立socket成功!\n");
// 绑定IP
ad.sin_family = AF_INET;
ad.sin_port = htons(9988);
inet_aton("120.6.20.247",&ad.sin_addr);//字符串转换成结构体
r = bind(fd,(struct sockaddr*)&ad,sizeof(ad));
if(r==-1) printf("bind err:%m\n"),exit(-1);
printf("绑定地址成功!\n");
// 读取数据
while(1)
{
len = sizeof(ad_snd);
r = recvfrom(fd,buf,sizeof(buf)-1,0,(struct sockaddr*)&ad_snd,&len);
if(r>0)
{
buf[r] = 0;
printf("发送者IP:%s,端口:%hu,数据:%s \n",
inet_ntoa(ad_snd.sin_addr),
ntohs(ad_snd.sin_port),
buf);
// char *inet_ntoa(struct in_addr in);
sendto(fd,"数据已经收到",strlen("数据已经收到"),0,(struct sockaddr*)&ad_snd,sizeof(ad_snd));
}
if(r == 0)
printf("关闭!\n");
if(r == -1)
{
printf("网络故障!\n");
break;
}
}
}
/// udpB.c 发送数据
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
main()
{
int fd;
struct sockaddr_in ad;
char buf[101];
int r;
fd = socket(AF_INET,SOCK_DGRAM,0);
if(fd == -1) printf("socket err:%m\n"),exit(-1);
ad.sin_family = AF_INET;
ad.sin_port = htons(9988);
ad.sin_addr.s_addr = inet_addr("120.6.20.247");
while(1)
{
r = read(0,buf,sizeof(buf)-1);
if(r <= 0) break;
buf[r] = 0;
r = sendto(fd,buf,r,0,(struct sockaddr*)&ad,sizeof(ad));
bzero(buf,sizeof(buf));
r = recv(fd,buf,sizeof(buf),0);
buf[r]= 0;
printf("回复的是:%s\n",buf);
if(r==-1) break;
}
close(fd);
}
截图: