Linux的网络命令:
ifconfig ->查看当前的网络IP地址
ifconfig xxx 192.168.13.yyy
ping 192.168.13.xxx
--------------假设与别人的MAC一致的话则需要修改一下-----------------
ifconfig eth0 down
ifconfig eth0 hw ether 00:0C:18:EF:FF:ED
ifconfig eth0 up
子网: 路由器分下网络 (局域网)
公网: 运营商里面的网络 (英特网)
IP地址的分类:
A 类 0.0.0.0 到 127.255.255.255
B 类 128.0.0.0 到 191.255.255.255
C 类 192.0.0.0 到 223.255.255.255
D 类 224.0.0.0 到 239.255.255.255
E 类 240.0.0.0 到 247.255.255.255
例如: 192.168.13.XXX ->网段号
xxx ->该网段的主机号
0 IP不可用
1 IP一般用做路由的网关 (不可用)
255 IP是用来做该网段的广播地址 (不可用的)
C类的可以用主机号为: 2 - 254
网络的分层模型:
OSI七层模型:
应用层
表示层
会话层 -> 应用层
-------------------------
传输层
网络层
--------------------------
数据链路层
物理层 ->物理层
---------------------------
简化的4层模型:
应用层
传输层
网络层
物理层
传输层:TCP 协议 UDP 协议
TCP协议:TCP传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。 (传输速度慢,网络会阻塞,用于控制指令,与文件的传输,每次数据的交互都以一个字节为单位的)
UDP协议:UDP数据报协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
(传输速度快,网络不会阻塞,只会丢失数据,多用于多媒体数据传输(视频,音频。。))
TCP的搭建步骤:
服务器端:
1.创建socket
2.绑定地址 bind
3.监听绑定的地址 listen
4.接收请求 accept
5.进行通信 read/write
6.关闭通信 close
客户端:
1.创建socket
2.链接服务器 connect
3.进行通信 read/write
4.关闭通信 close
UDP的搭建步骤:
服务器端:
1.创建socket
2.绑定socket
3.接收(recvfrom )或发送(sendto)
4.关闭通信
客户端:
1.创建socket
2.接收(recvfrom)或发送(sendto)
3.关闭通信
---------------------------------linux系统网络编程之TCP客户端的搭建流程-----------------------------------
1.创建socket
man 2 socket 查看函数的原型和头文件
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
参数一:协议族 (网络层的协议)
AF_INET -》 IPV4协议 (一般使用V4)
AF_INET6 -》 IPV6协议
AF_LOCAL -》 本地默认协议
参数二:传输协议 SOCK_STREAM ->数据流协议 TCP
SOCK_DGRAM ->数据报协议 UDP
参数三:属性 默认 0
返回值:成功: 返回新创建的套接字的描述符
失败: 返回-1
2.链接服务器
NAME
connect - initiate a connection on a socket
初始化一个网络通信socket
SYNOPSIS
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
返回值: 成功 0
失败 -1
重点!!!!!!服务器信息的设置:
struct sockaddr *addr -> struct结构体
通用地址结构
struct sockaddr
{
u_short sa_family;
char sa_data[14];
};
新型的IP地址结构体:
查看新型的结构体信息:
gedit /usr/include/linux/in.h
struct sockaddr_in {
__kernel_sa_family_t sin_family; 默认:AF_INET
__be16 sin_port;
struct in_addr sin_addr;
unsigned char __pad
};
---------------------------------------
端口号是用来区分数据发送给电脑中的哪一个网络应用程序,
他的取值范围是 0-> 65535 当然我们在使用的时候必须要注意如下:
1~1024一般是系统进程已经使用了,所以用户使用的话最好在1025 ~ 65535 之间
-----------------------------------------
struct in_addr sin_addr
struct in_addr {
__be32 s_addr;
};
__be32 -》32位的整形数据
把点分十进制的IP地址转换成整形
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
char *inet_ntoa(struct in_addr in);
#include <arpa/inet.h>
uint16_t htons(uint16_t hostshort);
uint16_t ntohs(uint16_t netshort);
服务器端的搭建步骤:
1.创建socket (同上)
2.绑定服务器的IP地址信息 (在路由上注册,IP与对应的端口)
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
参数一:socket描述符
参数二:服务器的IP地址信息
参数三:服务器的IP地址信息的大小
返回值: 成功返回0,否则返回-1
作为服务器的时候:我们可以使用系统定义的万能IP:0.0.0.0 或 INADDR_ANY 宏
使用万能IP后,系统就会自动检测本地网卡的IP地址进行绑定!!
#define INADDR_ANY ((unsigned long int) 0x00000000)
3.设置为监听模式
#include <sys/socket.h>
int listen(int s, int backlog);
参数一:需要设置的socket描述符
参数二: 最大的监听数 (同时可以接受多少个连接请求)
返回值:成功时返回0.错误时返回-1,
4.接受客户端的链接请求!!
#include <sys/types.h>
#include <sys/socket.h>
int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
参数一:监听模式下socket描述符
参数二:保存对方的IP地址信息
参数三:成功保存对方的IP地址信息的大小
返回值: 成功 新的同学对象
失败 -1
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
int main()
{
int socketfd=socket(AF_INET,SOCK_STREAM,0);
if(socketfd < 0)
{
perror("creat sock fail\n");
return -1;
}
struct sockaddr_in seraddr={0};
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(6666);
seraddr.sin_addr.s_addr = inet_addr("10.8.6.108");
int ret=connect(socketfd,(struct sockaddr *)&seraddr,sizeof(seraddr));
if(ret != 0)
{
perror("connect fail\n");
return -1;
}
while(1)
{
char buf[1024]={0};
scanf("%s",buf);
write(socketfd,buf,strlen(buf));
if(strcmp(buf,"exit") == 0)
{
break;
}
}
close(socketfd);
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
int main()
{
int socketfd=socket(AF_INET,SOCK_STREAM,0);
if(socketfd < 0)
{
perror("creat sock fail\n");
return -1;
}
struct sockaddr_in seraddr={0};
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(6666);
seraddr.sin_addr.s_addr = INADDR_ANY;
int ret=bind(socketfd,(struct sockaddr *)&seraddr,sizeof(seraddr));
if(ret != 0)
{
perror("bind fail\n");
return -1;
}
ret=listen(socketfd,5);
if(ret != 0)
{
perror("listen fail\n");
return -1;
}
struct sockaddr_in clienaddr={0};
int len=sizeof(clienaddr);
int newsocket=0;
newsocket=accept(socketfd,(struct sockaddr *)&clienaddr,&len);
if(newsocket < 0)
{
perror("accept fail\n");
return -1;
}
struct sockaddr stAddr = {0};
struct sockaddr_in stAddrIn = {0};
long lNameLen = sizeof(struct sockaddr);
if(0 == getsockname(newsocket, &stAddr, (socklen_t *)&lNameLen))
{
memcpy(&stAddrIn, &stAddr, lNameLen);
printf("CurSocket[%d], ClientAddr[%s:%d].\n", newsocket, inet_ntoa(stAddrIn.sin_addr), ntohs(stAddrIn.sin_port));
}
while(1)
{
char buf[1024]={0};
read(newsocket,buf,sizeof(buf));
printf("buf=%s\n",buf);
}
return -1;
}