SylixOS --- 简单的UDP客户端、服务端程序

UDP server:

/*********************************************************************************************************
**
**                                    中国软件开源组织
**
**                                   嵌入式实时操作系统
**
**                                       SylixOS(TM)
**
**                               Copyright  All Rights Reserved
**
**--------------文件信息------------------------------------------------------------------------------------
**
** 文   件   名: udp_server.c
**
** 创   建   人: Mr.Chen
**
** 文件创建日期: 2021年 05 月 20 日
**
** 描        述: UDP服务端程序
*********************************************************************************************************/
#include <sylixos.h>
#include <string.h>
#include <sys/socket.h>

#define SERVER_LISTENING_IP         "192.168.7.30"
#define SERVER_LISTENING_PORT       (8100)
#define TEST_BUF_SIZE               (256)
#define IP_ADDR_STR_LEN_MAX         (16)

static char receive_buf[TEST_BUF_SIZE];
/*********************************************************************************************************
** 函数名称: main
** 功能描述: 主函数
** 输 入  : argc,argv
** 输 出  : ERROR
** 全局变量:
** 调用模块:
*********************************************************************************************************/
int main(void)
{
    
    
    int ret;
    int sockfd;
    struct sockaddr_in sockaddr_local;
    struct sockaddr_in sockaddr_remote;
    socklen_t sockaddr_len;

    sockaddr_len = sizeof(sockaddr_remote);

    sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sockfd < 0) {
    
    
        printf("Failed to create UDP socket, errno = %d!\n", errno);
        return  (-1);
    }

    memset(&sockaddr_local, 0, sizeof(sockaddr_local));                 /* 配置本地服务端通信地址信息                                   */
    sockaddr_local.sin_len         = sizeof(struct sockaddr_in);
    sockaddr_local.sin_family      = AF_INET;
    sockaddr_local.sin_addr.s_addr = INADDR_ANY;
    sockaddr_local.sin_port        = htons(SERVER_LISTENING_PORT);

    ret = bind(sockfd, (struct sockaddr *)&sockaddr_local, sizeof(sockaddr_local));
    if (ret < 0) {
    
                                                          /* 绑定套接字                                                                   */
        printf("Failed to bind port %d, errno = %d!\n", SERVER_LISTENING_PORT, errno);
        close(sockfd);
        return  (-1);
    }

    printf("UDP echo server start.\n");

    while (1) {
    
    
        ssize_t len;
                                                                        /* 获取客户端发送的信息并打印 IP信息                    */
        len = recvfrom(sockfd, receive_buf, TEST_BUF_SIZE,
                       0, (struct sockaddr *)&sockaddr_remote, &sockaddr_len);
        if (len <= 0) {
    
    
            if ((errno != ETIMEDOUT) && (errno != EWOULDBLOCK)) {
    
    
                printf("Failed to recvfrom UDP echo client, errno = %d!\n", errno);
                 close(sockfd);
                 return  (-1);
            }

            continue;
        }

        receive_buf[len] = '\0';

        printf("receive from [ %s ]:\r\n", inet_ntoa(sockaddr_remote.sin_addr));
        printf("%s\r\n", receive_buf);
                                                                        /* 将获取的信息发送给客户端                                       */
        sendto(sockfd, receive_buf, len,
               0, (struct sockaddr *)&sockaddr_remote, sizeof(sockaddr_remote));

        if (strncmp(receive_buf, "exit", strlen("exit")) == 0) {
    
    
            break;
        }
    }

    close(sockfd);
    return 0;

}
/*********************************************************************************************************
  END
*********************************************************************************************************/

UDP client:

/*********************************************************************************************************
**
**                                    中国软件开源组织
**
**                                   嵌入式实时操作系统
**
**                                       SylixOS(TM)
**
**                               Copyright  All Rights Reserved
**
**--------------文件信息------------------------------------------------------------------------------------
**
** 文   件   名: udp_client.c
**
** 创   建   人: Mr.Chen
**
** 文件创建日期: 2021年 05 月 20 日
**
** 描        述: UDP客户端程序
*********************************************************************************************************/
#include <sylixos.h>
#include <string.h>
#include <sys/socket.h>

#define LOCAL_BIND_IP           "192.168.7.30"
#define LOCAL_BIND_PORT         (8100)
#define REMOVE_SERVER_IP        "192.168.7.66"
#define REMOVE_SERVER_PORT      (8001)
#define TEST_BUF_SIZE           (256)

static char receive_buf[TEST_BUF_SIZE];
/*********************************************************************************************************
** 函数名称: main
** 功能描述: 主函数
** 输 入  : argc,argv
** 输 出  : ERROR
** 全局变量:
** 调用模块:
*********************************************************************************************************/
int main(void)
{
    
    
    int sockfd;
    struct sockaddr_in sockaddr_remote;
    socklen_t sockaddr_len;
    int ret;

    sockaddr_len = sizeof(struct sockaddr_in);

    sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sockfd < 0) {
    
    
        printf("Failed to create UDP socket, errno = %d!\n", errno);

    }

    /*
     * Binding operations must be performed in the case of multiple network CARDS
     */
    struct sockaddr_in sockaddr_local;

    memset(&sockaddr_local, 0, sizeof(sockaddr_local));                 /* 配置本地通信地址信息                                               */
    sockaddr_local.sin_len         = sizeof(struct sockaddr_in);
    sockaddr_local.sin_family      = AF_INET;
    sockaddr_local.sin_addr.s_addr = inet_addr(LOCAL_BIND_IP);
    sockaddr_local.sin_port        = htons(LOCAL_BIND_PORT);

    ret = bind(sockfd, (struct sockaddr *)&sockaddr_local, sizeof(sockaddr_local));
    if (ret < 0) {
    
                                                          /* 绑定套接字                                                                   */
        printf("Failed to bind port %d, errno = %d!\n", LOCAL_BIND_PORT, errno);
        close(sockfd);
    }

    memset(&sockaddr_remote, 0, sizeof(sockaddr_remote));               /* 配置服务端通信地址信息                                           */
    sockaddr_remote.sin_len         = sizeof(struct sockaddr_in);
    sockaddr_remote.sin_family      = AF_INET;
    sockaddr_remote.sin_addr.s_addr = inet_addr(REMOVE_SERVER_IP);
    sockaddr_remote.sin_port        = htons(REMOVE_SERVER_PORT);

    printf("UDP echo client start.\n");

    while (1) {
    
    
        ssize_t ret_size;
                                                                        /* 向服务端发送信息并打印                                           */
        ret_size = sendto(sockfd, "Hello, MS-RTOS!\n", sizeof("Hello, MS-RTOS!\n"),
                          0, (struct sockaddr *)&sockaddr_remote, sockaddr_len);

        if (ret_size <= 0) {
    
    
            if ((errno != ETIMEDOUT) && (errno != EWOULDBLOCK)) {
    
    
                printf("Failed to sendto UDP echo server, errno = %d!\n", errno);
                 close(sockfd);
            }

            continue;
        }

                                                                        /* 接收服务端信息并打印                                               */
        ret_size = recvfrom(sockfd, receive_buf, (TEST_BUF_SIZE - 1),
                            0, (struct sockaddr *)&sockaddr_remote, &sockaddr_len);

        if (ret_size <= 0) {
    
    
            if ((errno != ETIMEDOUT) &&(errno != EWOULDBLOCK)) {
    
    
                printf("Failed to recvfrom UDP echo server, errno = %d!\n", errno);
                 close(sockfd);
            }

            continue;
        }

        receive_buf[ret_size] = '\0';
        printf("[recv data]: %s\n", receive_buf);

        if (strncmp(receive_buf, "exit", strlen("exit")) == 0) {
    
    
            break;
        }
    }

    close(sockfd);
    return 0;

}
/*********************************************************************************************************
  END
*********************************************************************************************************/

Guess you like

Origin blog.csdn.net/qq_40390825/article/details/117066132