Linux网络编程(1)

1. 网络开发两种设计模式

2. 网络模型分层

3. 以太网帧协议

4. IP协议

输入网址后,通过DNS域名解析服务器解析域名,得到IP地址。

数据每经过一个路由节点,8位生存时间就被减1,当减到0时,数据就被路由节点丢弃了,防止垃圾数据一直在网络中传。

5. udp协议

6. tcp协议

7. tcp-ip四层模型协议封装

8. udp和tcp讲解

用TCP协议的话,比如服务端每次发送1M数据,那么客户端每次收多少数据都行,比如每次收1K;用UDP协议的话,比如服务端每次发送10K数据,那么客户端每次就只能收10K数据。

9. 什么是套接字

10. 套接字内存模型

11. 网络字节序转化

计算机中数据以小端法存储,而网络中传输需要大端法存储的数据(路由节点在解包时想获得IP地址和mac地址,需要是大端法存储的),所以需要进行转换。

IP地址是32位的,端口号Port是16位的,所以他们要分别用不同的函数转换。

12. ip地址转换函数

函数inet_pton中:参数af一般取AF_INET代表IPv4,src是传入的字符串,dst是传出参数;

函数inet_ntop中:参数af一般取AF_INET代表IPv4,src是传入参数,dst是传出的字符串,size是传入参数,表示字符串的大小。

13. sockaddr数据结构

其中sin_family一般设为AF_INET,代表IPv4。sin_port代表端口号。sin_addr.s_addr代表IP地址。

注:在使用时,要将创建好的sockaddr_in结构体变量取地址,然后强转类型为(struct sockaddr*)。

14. 网络套接字函数

15. CS模型流程图

          

          

16. server实现

          

 

执行结果:

17. server和client通信

server端实现

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <arpa/inet.h>
#include <ctype.h>

int main(int argc, const char* argv[])
{
    // 创建监听的套接字
    int lfd = socket(AF_INET, SOCK_STREAM, 0);
    if(lfd == -1)
    {
        perror("socket error");
        exit(1);
    }

    // lfd 和本地的IP port绑定
    struct sockaddr_in server;
    memset(&server, 0, sizeof(server));
    server.sin_family = AF_INET;    // 地址族协议 - ipv4
    server.sin_port = htons(8888);
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    int ret = bind(lfd, (struct sockaddr*)&server, sizeof(server));
    if(ret == -1)
    {
        perror("bind error");
        exit(1);
    }

    // 设置监听
    ret = listen(lfd, 20);
    if(ret == -1)
    {
        perror("listen error");
        exit(1);
    }

    // 等待并接收连接请求
    struct sockaddr_in client;
    socklen_t len = sizeof(client);
    int cfd = accept(lfd, (struct sockaddr*)&client, &len);
    if(cfd == -1)
    {
        perror("accept error");
        exit(1);
    }

    printf(" accept successful !!!\n");
    char ipbuf[64] = {0};
    printf("client IP: %s, port: %d\n", 
           inet_ntop(AF_INET, &client.sin_addr.s_addr, ipbuf, sizeof(ipbuf)),
           ntohs(client.sin_port));
    // 一直通信
    while(1)
    {
        // 先接收数据
        char buf[1024] = {0};
        int len = read(cfd, buf, sizeof(buf));
        if(len == -1)
        {
            perror("read error");
            exit(1);
        }
        else if(len == 0)
        {
            printf(" 客户端已经断开了连接 \n");
            close(cfd);
            break;
        }
        else
        {
            printf("recv buf: %s\n", buf);
            // 转换 - 小写 - 大写
            for(int i=0; i<len; ++i)
            {
                buf[i] = toupper(buf[i]);
            }
            printf("send buf: %s\n", buf);
            write(cfd, buf, len);
        }
    }

    close(lfd);

    return 0;
}

client端实现 

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <arpa/inet.h>

int main(int argc, const char* argv[])
{
    if(argc < 2)
    {
        printf("eg: ./a.out port\n");
        exit(1);
    }

    int port = atoi(argv[1]);
    // 创建套接字
    int fd = socket(AF_INET, SOCK_STREAM, 0);

    // 连接服务器
    struct sockaddr_in serv;
    memset(&serv, 0, sizeof(serv));
    serv.sin_family = AF_INET;
    serv.sin_port = htons(port);
    // oserv.sin_addr.s_addr = htonl();
    inet_pton(AF_INET, "127.0.0.1", &serv.sin_addr.s_addr);
    connect(fd, (struct sockaddr*)&serv, sizeof(serv) );

    // 通信
    while(1)
    {
        // 发送数据
        char buf[1024];
        printf("请输入要发送的字符串: \n");
        fgets(buf, sizeof(buf), stdin);
        write(fd, buf, strlen(buf));

        // 等待接收数据
        int len = read(fd, buf, sizeof(buf));
        if(len == -1)
        {
            perror("read error");
            exit(1);
        }
        else if(len == 0)
        {
            printf("服务器端关闭了连接\n");
            break;
        }
        else
        {
            printf("recv buf: %s\n", buf);
        }
    }

    close(fd);

    return 0;
}

执行结果:先启动server端,再启动client端。

client端:

 

server端:

猜你喜欢

转载自blog.csdn.net/mengyujia1234/article/details/92608496
今日推荐