Linux程序设计之——网络编程

一、了解计算机网络通信原理

   1、 操作系统七层模型

          应用层:实现人机直接交互的上层应用软件

          表示层:人机交互的视觉显示层次

          会话层:计算机内部的信号与槽

          运输层:通信协议的运输方式控制层

          网络层:网络间的IP协议控制层

          数据链路层:数据二进制(字符)转换层

         物理层:各种硬件及网络接口

TCP/IP四层模型:

         应用层:人机交互,数据的发送与接收交互

         传输层:TCP/UDP协议所在层,选择协议封装(解析)数据

         网络层:控制数据的发送IP地址

         网络接口层:网线接口

    2、计算机是怎样进行网络通信的

          应用层编辑数据——传输层根据TCP/UDP添加包头等信息封装成数据帧——网络层添加目标IP地址,控制数据发送目标位置——网络接口层将数据帧转换成二进制电平发送出去

 

二、熟悉网络协议

    1、网络IP的划分

         Linux程序设计之——网络编程

             Linux程序设计之——网络编程

    2、内网和外网的通信

        1、内网的网络号相同,主机号不同,按照网络编程socket编程即可通信。

        2、外网的主机号跟网络号皆有可能不同,外网通信需要经过路由器的转换。

三、如何在计算机上进行网络编程

socket编程流程:

Linux程序设计之——网络编程

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);
    
}