TCP server:
/*********************************************************************************************************
**
** 中国软件开源组织
**
** 嵌入式实时操作系统
**
** SylixOS(TM)
**
** Copyright All Rights Reserved
**
**--------------文件信息------------------------------------------------------------------------------------
**
** 文 件 名: tcp_server.c
**
** 创 建 人: Mr.Chen
**
** 文件创建日期: 2021年 05 月 20 日
**
** 描 述: TCP服务端程序
*********************************************************************************************************/
#include <sylixos.h>
#include <string.h>
#include <sys/socket.h>
#define SERVER_LISTENING_IP "192.168.7.30"
#define SERVER_LISTENING_PORT (8101)
#define TCP_ECHO_TIMEOUT_SERVER 1
#define TEST_BUF_SIZE (256)
static char receive_buf[TEST_BUF_SIZE];
/*********************************************************************************************************
** 函数名称: main
** 功能描述: 主函数
** 输 入 : argc,argv
** 输 出 : ERROR
** 全局变量:
** 调用模块:
*********************************************************************************************************/
int main(void)
{
int ret;
int sockfd_server;
int sockfd_client;
struct sockaddr_in sockaddr_server;
struct sockaddr_in sockaddr_client;
socklen_t sockaddr_len;
struct timeval tv;
fd_set rset;
sockfd_server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sockfd_server < 0) {
printf("Failed to create TCP socket, errno = %d!\n", errno);
}
memset(&sockaddr_server, 0, sizeof(sockaddr_server)); /* 配置本地服务端通信地址信息 */
sockaddr_server.sin_len = sizeof(struct sockaddr_in);
sockaddr_server.sin_family = AF_INET;
sockaddr_server.sin_addr.s_addr = inet_addr(SERVER_LISTENING_IP);
sockaddr_server.sin_port = htons(SERVER_LISTENING_PORT);
ret = bind(sockfd_server, (struct sockaddr *)&sockaddr_server, sizeof(sockaddr_server));
if (ret < 0) {
/* 绑定套接字 */
printf("Failed to bind port %d, errno = %d!\n", SERVER_LISTENING_PORT, errno);
close(sockfd_server);
}
printf("TCP echo server start listening.\n");
listen(sockfd_server, 5); /* 监听 */
sockaddr_len = sizeof(struct sockaddr_in);
sockfd_client = accept(sockfd_server, (struct sockaddr *)&sockaddr_client, &sockaddr_len);
if (sockfd_client < 0) {
/* 获取客户端请求 */
printf("Failed to accept connection, errno = %d!\n", errno);
close(sockfd_server);
}
printf("TCP receive conection from %s:%u\r\n",
inet_ntoa(sockaddr_client.sin_addr),
ntohs(sockaddr_client.sin_port));
while (1) {
ssize_t len;
/*
* 等待至少一个 socket 可读,并设置等待的超时时间
*/
tv.tv_sec = TCP_ECHO_TIMEOUT_SERVER;
tv.tv_usec = 0;
/*
* 将文件描述符加入到可读文件描述符集
*/
FD_ZERO(&rset);
FD_SET(sockfd_client, &rset);
ret = select(sockfd_client+1, &rset, NULL, NULL, &tv);
if (ret < 0) {
/*
* 出错
*/
fprintf(stderr, "TCP echo server select error.\r\n");
} else if (ret == 0) {
/*
* 超时
*/
fprintf(stderr, "TCP echo server select timeout.\r\n");
} else {
/*
* socket 可读
*/
if (FD_ISSET(sockfd_client, &rset)) {
len = read(sockfd_client, receive_buf, TEST_BUF_SIZE); /* 读取客户端信息并打印 */
if (len <= 0) {
if ((errno != ETIMEDOUT) && (errno != EWOULDBLOCK)) {
printf("Failed to read form TCP echo client, errno = %d\n", errno);
close(sockfd_client);
}
continue;
} else {
receive_buf[len] = '\0';
printf("recv from %s:%u:\r\n%s\r\n", /* 打印远端 IP 和端口及接收到的数据 */
inet_ntoa(sockaddr_client.sin_addr),
ntohs(sockaddr_client.sin_port),
receive_buf);
len = write(sockfd_client, receive_buf, len); /* 将获取的信息发送给客户端 */
printf("TCP echo server echo %d byte.\n", len);
if (strncmp(receive_buf, "bye", strlen("bye")) == 0) {
break;
}
}
}
}
}
close(sockfd_client);
close(sockfd_server);
return 0;
}
/*********************************************************************************************************
END
*********************************************************************************************************/
TCP client:
/*********************************************************************************************************
**
** 中国软件开源组织
**
** 嵌入式实时操作系统
**
** SylixOS(TM)
**
** Copyright All Rights Reserved
**
**--------------文件信息--------------------------------------------------------------------------------
**
** 文 件 名: tcp_client.c
**
** 创 建 人: Mr.Chen
**
** 文件创建日期: 2021年 05 月 20 日
**
** 描 述: TCP客户端程序
*********************************************************************************************************/
#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 ret;
int sockfd;
struct sockaddr_in sockaddr;
struct sockaddr_in sockaddr_local;
//
// socklen_t sockaddr_len;
//
// sockaddr_len = sizeof(struct sockaddr_in);
sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sockfd < 0) {
printf("Failed to create TCP socket, errno = %d!\n", errno);
}
/*
* Binding operations must be performed in the case of multiple network CARDS
*/
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, 0, sizeof(sockaddr)); /* 配置服务器端通信地址信息 */
sockaddr.sin_len = sizeof(struct sockaddr_in);
sockaddr.sin_family = AF_INET;
sockaddr.sin_addr.s_addr = inet_addr(REMOVE_SERVER_IP);
sockaddr.sin_port = htons(REMOVE_SERVER_PORT);
if (connect(sockfd, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == -1) {
printf("Failed to connect TCP server, errno = %d!\n", errno); /* 连接服务端 */
close(sockfd);
return (-1);
}
printf("TCP echo client connect server success.\n");
while (1) {
ssize_t len;
len = read(sockfd, receive_buf, (TEST_BUF_SIZE - 1)); /* 获取服务端信息并打印 */
if (len > 0) {
receive_buf[len] = 0;
printf("[recv data]: %s\n", receive_buf);
if (strncmp(receive_buf, "exit", strlen("exit")) == 0) {
break;
}
}
len = write(sockfd, receive_buf, len); /* 将获取的信息发送给服务端 */
if (len <= 0) {
if ((errno != ETIMEDOUT) && (errno != EWOULDBLOCK)) {
printf("Failed to write to TCP server, errno = %d!\n", errno);
close(sockfd);
}
continue;
}
}
close(sockfd);
return (0);
}
/*********************************************************************************************************
END
*********************************************************************************************************/