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