UDP通信

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

```
    原文作者:dab61956e53d
    原文地址: https://www.jianshu.com/p/308171f071c0
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞