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
*********************************************************************************************************/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值