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

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

Guess you like

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