华清远见嵌入式学习day20——UDP

【1】 atoi()
    将字符串转化为整数
    
【2】
   struct sockaddr_in serveraddr = {
         .sin_family = AF_INET,
         .sin_port = htons(atoi(argv[2])),
          .sin_addr.s_addr = inet_addr(argv[1]),
    };

【3】终端输入去 \n
    fgets(buf,sizeof(buf),stdin);
    buf[strlen(buf) - 1] = '\0';  //  吃点\n
    
    
【4】获取客户端IP地址和端口号

    struct sockaddr_in clientaddr;
    accept(sockfd,(struct sockaddr *)&clientaddr,&clientlen);
    
    系统自动填充clientaddr内容;
    获取IP: inet_ntoa(clientaddr.sin_addr);
    获取端口号:ntohs(clientaddr.sin_port);

【5】 if(argc < 3)
    判断终端输入个数
    argv[0] ==>  ./server
    argv[1] ==>  192.168.0.40
    argv[2] ==>  8888
    
【6】
    服务器可以绑定任意主机IP
    htonl(INADDR_ANY);
    //只能在服务器端使用;
    
【7】
    客户端输入 quit ; 然后客户端关闭;
    strncmp(buf,“quit”,4);
    
【8】ftp文件服务器

    IO里面的;
    
伪代码:
    
    服务器端:
    1. socket();
    2. 填充结构体
    3. bind();
    4. listen(); 
    5. 
        while(1)
        {
            accept();
            recv(buf);
            
            switch(buf[0])
            {
                case 'L':
                    process_list();
                case 'P':
                    process_put(int acceptfd,buf+2);// P filename
                case 'G':
                    process_get();
                case 'Q':
                    exit(0);
            }
        }
    6. 
    process_put()
    {
        recv(buf)
            //buf = (P + filename)
    }
    
=======================================    
    
    客户端:
    
    1. socket();
    2. 填充结构体
    3. connect();
    4. 
        while(1)
        {
            printf("************list**********\n");
            printf("*******put filename*******\n");    
            printf("*******get filename*******\n");
            printf("***********quit **********\n");
            
            fgets(buf);
            // list  
            // put 1.c 
            // get server.c
            switch(buf[0])
            {
                case 'l':
                    do_list(sockfd);
                    break;
                case 'p':
                    do_put(sockfd,buf+4);  //put 1.c
                    break;
                case 'g':
                    do_get();
                    break;
                default:
                    break;
            }
        }
        close(fd);
        
    5. 实现
        do_list()
        {
            //封装一下字符
            //发送具体要实现的功能(封装的字符发送给服务器)
            // 发送 'L' ,告诉服务器是list请求;
            send(sockfd,buf);
            
        }
        do_put(int sockfd, char *filename)
        {
            'P + filename'  //先封装P,然后发送给服务器;
            send();
            open();
            write();
        }
        do_get();
        
    
【9】
recvfrom

NAME
       recv, recvfrom, recvmsg - receive a message from a socket

SYNOPSIS
    #include <sys/types.h>
    #include <sys/socket.h>
       
    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);
    功能;用于接收数据,
    参数: 
        1. sockfd ,sockfd
        2. buf 
        3. sizeof(buf);
        4. 0    表示阻塞
        5. 想要关心数据具体是从哪个客户端来的,那么需要填充第5和6参数
            如果不需要关心数据是从哪个客户端来的,填 NULL,NULL;

【10】sendto
NAME
       send, sendto, sendmsg - send a message on a socket

SYNOPSIS
       #include <sys/types.h>
       #include <sys/socket.h>
       ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);
        功能:发送数据,
        参数:    
            dest_addr: 指定数据具体发送给谁
            addrlen :  大小
【11】UDP中可以使用send函数,但是需要先使用connect函数,但不是用于连接,是指定具体数据是发送给谁。

【12】 
    1. UDP代码实现;
    2. ftp文件服务器代码实现;
    
  
 

猜你喜欢

转载自blog.csdn.net/UemTuBXuR/article/details/89132381