直接看代码吧 v๑乛◡乛๑
udp_server.c
/*********************************************************************************************************
**--------------文件信息--------------------------------------------------------------------------------
**
** 文 件 名: udp_server.c
** 创 建 人: ***
**
** 文件创建日期: ** 年 ** 月 ** 日
**
** 描 述: UDP 回射服务器程序
*********************************************************************************************************/
#include
#include
#include
/*********************************************************************************************************
宏定义
*********************************************************************************************************/
#define __UDP_ECHO_TYPE_CLIENT 1 /* 客户端模式 */
#define __UDP_ECHO_TYPE_SERVER 2 /* 服务器模式 */
#define __UDP_ECHO_TYPE (__UDP_ECHO_TYPE_SERVER) /* 当前模式选择 */
#define __UDP_ECHO_IP_CLIENT "10.4.0.95" /* 客户端 IP 地址 */
#define __UDP_ECHO_IP_SERVER "10.4.0.96" /* 服务器 IP 地址 */
#define __UDP_ECHO_PORT_CLIENT 8000 /* 客户端端口号 */
#define __UDP_ECHO_PORT_SERVER 8001 /* 服务器端口号 */
#define __UDP_ECHO_BUFF_SIZE_CLIENT 257 /* 客户端接收缓冲区大小 */
#define __UDP_ECHO_BUFF_SIZE_SERVER 257 /* 服务器接收缓冲区大小 */
/*********************************************************************************************************
** 函数名称: __UdpEchoServer
** 功能描述: UDP 回射服务器程序
** 输 入 : NONE
** 输 出 : ERROR
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static int __UdpEchoServer (void){
int iRet = -1; /* 操作结果 */
int sockFd = -1; /* socket 描述符 */
socklen_t uiAddrLen = sizeof(struct sockaddr_in); /* 地址结构大小 */
register ssize_t sstRecv = 0; /* 接收到的数据长度 */
char cRecvBuff[__UDP_ECHO_BUFF_SIZE_SERVER] = {0}; /* 接收缓冲区 */
struct sockaddr_in sockaddrinLocal; /* 本地地址 */
struct sockaddr_in sockaddrinRemote; /* 远端地址 */
fprintf(stdout, "UDP echo server start.\n");
sockFd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); /* 创建 socket */
if (sockFd < 0) { /* 操作失败 */
printf("UDP echo server socket error.\n");
return (-1); /* 错误返回 */
}
/*
* 初始化本地地址结构
*/
memset(&sockaddrinLocal, 0, sizeof(sockaddrinLocal)); /* 清空地址信息 */
sockaddrinLocal.sin_len = sizeof(struct sockaddr_in); /* 地址结构大小 */
sockaddrinLocal.sin_family = AF_INET; /* 地址族 */
sockaddrinLocal.sin_addr.s_addr = INADDR_ANY;
sockaddrinLocal.sin_port = htons(__UDP_ECHO_PORT_SERVER); /* 绑定服务器端口 */
iRet = bind(sockFd, (struct sockaddr *)&sockaddrinLocal, sizeof(sockaddrinLocal));
/* 绑定本地地址与端口 */
if (iRet < 0) { /* 绑定操作失败 */
close(sockFd); /* 关闭已经创建的 socket */
fprintf(stderr, "UDP echo server bind error.\n");
return (-1); /* 错误返回 */
}
for (;;)
{
memset(&cRecvBuff[0], 0, __UDP_ECHO_BUFF_SIZE_SERVER); /* 清空接收缓冲区 */
sstRecv = recvfrom(sockFd,(void *)&cRecvBuff[0], __UDP_ECHO_BUFF_SIZE_SERVER,
0, (struct sockaddr *)&sockaddrinRemote, &uiAddrLen);
/* 从远端接收数据 */
if (sstRecv <= 0) { /* 接收数据失败 */
if ((errno != ETIMEDOUT) && (errno != EWOULDBLOCK)) { /* 非超时与非阻塞 */
close(sockFd); /* 关闭已经创建的 socket */
fprintf(stderr, "UDP echo server recvfrom error.\n");
return (-1);
}
continue;
}
sendto(sockFd, (const void *)&cRecvBuff[0], sstRecv, 0,
(const struct sockaddr *)&sockaddrinRemote, uiAddrLen);
}//for
}
int main(int argc, char* argv[]){
__UdpEchoServer();
return 0;
}
/*********************************************************************************************************
END
*********************************************************************************************************/
/*********************************************************************************************************
** 文 件 名: udp_client.c
**
** 创 建 人: ***
**
** 文件创建日期: ** 年 ** 月 ** 日
**
** 描 述: UDP 回射客户端程序
*********************************************************************************************************/
#include
#include
#include
/*********************************************************************************************************
宏定义
*********************************************************************************************************/
#define __UDP_ECHO_TYPE_CLIENT 1 /* 客户端模式 */
#define __UDP_ECHO_TYPE_SERVER 2 /* 服务器模式 */
#define __UDP_ECHO_TYPE (__UDP_ECHO_TYPE_CLIENT) /* 当前模式选择 */
#define __UDP_ECHO_IP_CLIENT "10.4.0.96" /* 客户端 IP 地址 */
#define __UDP_ECHO_IP_SERVER "10.4.0.95" /* 服务器 IP 地址 */
#define __UDP_ECHO_PORT_CLIENT 8000 /* 客户端端口号 */
#define __UDP_ECHO_PORT_SERVER 8001 /* 服务器端口号 */
#define __UDP_ECHO_BUFF_SIZE_CLIENT 257 /* 客户端接收缓冲区大小 */
#define __UDP_ECHO_BUFF_SIZE_SERVER 257 /* 服务器接收缓冲区大小 */
/*********************************************************************************************************
** 函数名称: __UdpEchoClient
** 功能描述: UDP 回射客户端程序
** 输 入 : NONE
** 输 出 : ERROR
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static int __UdpEchoClient (void)
{
int sockFd = -1; /* socket 描述符 */
socklen_t uiAddrLen = sizeof(struct sockaddr_in); /* 地址结构大小 */
register ssize_t sstRecv = 0; /* 接收到的数据长度 */
register ssize_t sstSend = 0; /* 接收到的数据长度 */
const char *pcSendData = "SylixOS Hello!\n"; /* 需要发送的字符串 */
char cRecvBuff[__UDP_ECHO_BUFF_SIZE_CLIENT] = {0}; /* 接收缓冲区 */
struct sockaddr_in sockaddrinRemote; /* 远端地址 */
fprintf(stdout, "UDP echo client start.\n");
sockFd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); /* 创建 socket */
if (sockFd < 0) {
fprintf(stderr, "UDP echo client socket error.\n");
return (-1);
}
/*
* 初始化远端地址结构
*/
memset(&sockaddrinRemote, 0, sizeof(sockaddrinRemote));
if (!inet_aton(__UDP_ECHO_IP_SERVER, &sockaddrinRemote.sin_addr)) { /* 地址转换错误 */
close(sockFd); /* 关闭已经创建的 socket */
fprintf(stderr, "UDP echo client get addr error.\n");
return (-1); /* 错误返回 */
}
sockaddrinRemote.sin_len = sizeof(struct sockaddr_in); /* 地址结构大小 */
sockaddrinRemote.sin_family = AF_INET; /* 地址族 */
sockaddrinRemote.sin_port = htons(__UDP_ECHO_PORT_SERVER); /* 绑定服务器端口 */
for (;;) {
fprintf(stdout, "Send Data: %s", pcSendData);
sstRecv = strlen(pcSendData); /* 获取发送字符串长度 */
sstSend = sendto(sockFd, (const void *)pcSendData, sstRecv, 0,
(const struct sockaddr *)&sockaddrinRemote, uiAddrLen);
/* 发送数据到指定的服务器端 */
if (sstSend <= 0) { /* 发送数据失败 */
if ((errno != ETIMEDOUT) && (errno != EWOULDBLOCK)) { /* 非超时与非阻塞 */
close(sockFd); /* 关闭已经创建的 socket */
fprintf(stderr, "UDP echo client sendto error.\n");
return (-1); /* 错误返回 */
}
continue; /* 超时或非阻塞后重新运行 */
}
memset(&cRecvBuff[0], 0, __UDP_ECHO_BUFF_SIZE_CLIENT);
sstRecv = recvfrom(sockFd, (void *)&cRecvBuff[0], __UDP_ECHO_BUFF_SIZE_SERVER,
0, (struct sockaddr *)&sockaddrinRemote, &uiAddrLen);
/* 从远端接收数据 */
if (sstRecv <= 0) { /* 接收数据失败 */
if ((errno != ETIMEDOUT) &&(errno != EWOULDBLOCK)) { /* 非超时与非阻塞 */
close(sockFd); /* 关闭已经创建的 socket */
fprintf(stderr, "UDP echo client recvfrom error.\n");
return (-1); /* 错误返回 */
}
continue; /* 超时或非阻塞后重新运行 */
}
fprintf(stdout, "Recv Data: ");
cRecvBuff[sstRecv] = 0;
fprintf(stdout, "%s\n", &cRecvBuff[0]);
sleep(5); /* 休眠一段时间 */
}//for
return (0);
}
int main(int argc, char* argv[]){
__UdpEchoClient();
return 0;
}
/*********************************************************************************************************
END
*********************************************************************************************************/