Linux程序设计之——网络编程
一、了解计算机网络通信原理
1、 操作系统七层模型
应用层:实现人机直接交互的上层应用软件
表示层:人机交互的视觉显示层次
会话层:计算机内部的信号与槽
运输层:通信协议的运输方式控制层
网络层:网络间的IP协议控制层
数据链路层:数据二进制(字符)转换层
物理层:各种硬件及网络接口
TCP/IP四层模型:
应用层:人机交互,数据的发送与接收交互
传输层:TCP/UDP协议所在层,选择协议封装(解析)数据
网络层:控制数据的发送IP地址
网络接口层:网线接口
2、计算机是怎样进行网络通信的
应用层编辑数据——传输层根据TCP/UDP添加包头等信息封装成数据帧——网络层添加目标IP地址,控制数据发送目标位置——网络接口层将数据帧转换成二进制电平发送出去
二、熟悉网络协议
1、网络IP的划分
2、内网和外网的通信
1、内网的网络号相同,主机号不同,按照网络编程socket编程即可通信。
2、外网的主机号跟网络号皆有可能不同,外网通信需要经过路由器的转换。
三、如何在计算机上进行网络编程
socket编程流程:
TCP编程代码演示:
//TCP通信模型
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include<string.h>
/*
初始化套接字函数
成功返回socket fd,失败返回-1;
*/
int init_socket()
{
return socket(AF_INET,SOCK_STREAM,0);
}
/*
绑定IP
参数:服务器的fd
返回值:成功返回0,失败返回-1
*/
int bindip(int serverfd)
{
struct sockaddr_in serverAddr;
memset(&serverAddr,'\0',sizeof(serverAddr));
serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(10086);//设置端口号
serverAddr.sin_addr.s_addr=inet_addr("192.168.1.65");//设置IP地址
int res=bind(serverfd,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
if(res==-1)
{
perror("bind fail");
return -1;
}
return 0;
}
//3.创建监听队列 listen
int listen_fun(int serverfd)
{
int res=listen(serverfd, 5);
if(res==-1)
{
perror("listen fail");
return -1;
}
return 0;
}
//4.接受客户端的连接(阻塞等待有客户端连接过来)
//返回值:成功返回客户端的fd,失败返回-1;
int accept_client(int serverfd)
{
struct sockaddr_in clientAddr;
socklen_t clientAddrLen=sizeof(clientAddr);//!!!!
int clientFd=accept(serverfd,(struct sockaddr*)&clientAddr,&clientAddrLen);
return clientFd;
}
int main()
{
int serverfd,clientfd;
//1
serverfd = init_socket();
if(serverfd==-1)
{
perror("create socket fail\n");
return -1;
}
//2
bindip(serverfd);
//3
listen_fun(serverfd);
//4
clientfd = accept_client(serverfd);
if(clientfd==-1)
{
perror("accept fail");
return -1;
}
printf("accept sucess\n");
//5从客户端中读取信息
char buf[1024]={0};
int res1=read(clientfd,buf,sizeof(buf));
if(res1==-1)
{
perror("read fail");
return -1;
}
printf("res1=%d buf:%s",res1,buf);
//6关闭客户端
close(clientfd);
close(serverfd);
}
#include<stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include<string.h>
int main()
{
//1.创建客户端套接字
int clientFd=socket(AF_INET,SOCK_STREAM,0);
if(clientFd==-1)
{
perror("create socket fail\n");
return -1;
}
sleep(2);
//2.连接服务器
struct sockaddr_in serverAddr;
memset(&serverAddr,'\0',sizeof(serverAddr));
serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(10086);//设置连接的服务器端口号
serverAddr.sin_addr.s_addr=inet_addr("192.168.6.100");//设置要连接的服务器IP地址
int res= connect(clientFd, (struct sockaddr *)&serverAddr,sizeof(serverAddr));
if(res==-1)
{
perror("connect fail");
return -1;
}
//3.往服务器中写入数据
char buf[1024]="It is not easy!";
write(clientFd,buf,sizeof(buf));
close(clientFd);
}