UDP通信

作者: wulegekong | 来源:发表于2017-02-20 15:10 被阅读0次

    UDP - 面向无连接, 不安全的传输层协议.
    API:

    //创建套接字
     int socket(int domain, int type, int protocol);
     参数:
     domain
     type: tcp - 流式协议  udp - 报式协议
     protocol - 协议类型, 会根据type默认为TCP或UDP
     返回值:文件描述符(套接字)
    //将本地的IP和端口与创建出的套接字绑定
     int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
     参数:
     sockfd - 创建出的文件描述符 
     addr - - 端口和IP
     addrlen - addr结构体的长度
    //接收数据: recvfrom
    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
    参数:
     fd - 文件描述符
     buf: 接收数据缓冲区
     len: buf的最大容量
     flags: 0
     src_addr: 另一端的IP和端口, 传出参数
     addrlen: 传入传出参数
    //发送数据: sendto
    ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t sockaddr *dest_addr, socklen_t addrlen);
    参数:
     sockfd: socket函数创建出来的  buf: 存储发送的数据
     len: 发送的数据的长度
     flags: 0
     dest_addr: 另一端的IP和端口
     addrlen: dest_addr长度
    

    服务端代码

    #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 fd = socket(AF_INET, SOCK_DGRAM, 0);
    
        struct sockaddr_in serv_addr;
        bzero(&serv_addr, sizeof(serv_addr));
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(8888);
        serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    
        int ret = bind(fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
        if(ret == -1)
        {
            perror("bind error");
            exit(1);
        }
    
        char bufip[128];
        struct sockaddr_in clien;
        socklen_t clien_len = sizeof(clien);
        while(1)
        {
            char buf[1024] = {0};
            int len = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr*)&clien, &clien_len);
            if(len == -1)
            {
                perror("recvfrom error");
                exit(1);
            }
            printf("client ip: %s, port: %d\n",
                   inet_ntop(AF_INET, &clien.sin_addr.s_addr, bufip, sizeof(bufip)),
                   ntohs(clien.sin_port));
            printf("read buf = %s\n", buf);
    
            for(int i=0; i<len; ++i)
            {
                buf[i] = toupper(buf[i]);
            }
    
            printf("touper: %s\n", buf);
            len = sendto(fd, buf, strlen(buf)+1, 0, (struct sockaddr*)&clien, clien_len);
            if(len == -1)
            {
                perror("sendto error");
                exit(1);
            }
        }
        close(fd);
    
        return 0;
    }
    

    客户端代码:

    #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[])
    {
        int fd = socket(AF_INET, SOCK_DGRAM, 0);
    
        struct sockaddr_in serv_addr;
        memset(&serv_addr, 0, sizeof(serv_addr));
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(8888);
        inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr.s_addr);
    
    
        while(1)
        {
            char buf[1024] = {0};
            
            fgets(buf, sizeof(buf), stdin);
            int ret = sendto(fd, buf, strlen(buf)+1, 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
            if(ret == -1)
            {
                perror("sendto error");
                exit(1);
            }
            
    
            int servlen = sizeof(servlen);
            ret = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr*)&serv_addr, &servlen);
            if(ret == -1)
            {
                perror("recvfrom error");
                exit(1);
            }
            printf("recv buf = %s\n", buf);
        }
        return 0;
    }
    
    ```

    相关文章

      网友评论

        本文标题:UDP通信

        本文链接:https://www.haomeiwen.com/subject/urcewttx.html