SylixOS---TCP/IP的TCP socket通信

该博客展示了如何在SylixOS操作系统中通过127.0.0.1回环地址实现TCP/IP通信。文中详细介绍了服务器端和客户端的流程,并提供了相应的C语言代码实现。客户端进行20000次4096字节的数据发送,测试了发包速度,计算了总耗时和平均吞吐量。
摘要由CSDN通过智能技术生成

编写SylixOS系统下通过127.0.0.1回环地址进行TCP/IP通信,并测试发包速度。

1.流程

1.1服务器端流程

在这里插入图片描述

1.2客户端流程

在这里插入图片描述

2.代码:

2.1服务器端代码

/*********************************************************************************************************
**
**                                    中国软件开源组织
**
**                                   嵌入式实时操作系统
**
**                                       SylixOS(TM)
**
**                               Copyright  All Rights Reserved
**
**--------------文件信息-------------------------------------------------------------------------------------
**
** 文   件   名: tcp_server.c
**
** 创   建   人: Chen
**
** 文件创建日期: 2020 年 12 月 15 日
**
** 描        述: 测试tcp协议服务端收发功能
*********************************************************************************************************/
#include "test_common.h"

/*********************************************************************************************************
** 函数名称: tcpServer
** 功能描述: 测试tcp协议服务端收发功能
** 输 入  : NONE
** 输 出  : NONE
*********************************************************************************************************/
INT main (VOID)
{
    INT                iRet;
    INT                iSockFd;
    INT                iConnfd;

    struct sockaddr_in server_addr;
    CHAR               cBuf[BUFFSIZE] = {0};

    fprintf(stdout, "----------TCP echo server start.----------\n");
    fprintf(stdout, "please set NetAssist\n");


    iSockFd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);                /*  建立套接字                                                                */
    if (iSockFd < 0) {
        printf("error: socket error\n");
        return (PX_ERROR);
    }

    server_addr.sin_family      = AF_INET;                              /*  IPv4                        */
    server_addr.sin_port        = htons(PORT);                          /*  监听通道 8000                  */
    server_addr.sin_addr.s_addr = INADDR_ANY;                           /*  表示接收任意IP的连接请求                                  */

    iRet = bind(iSockFd, (struct sockaddr *)&server_addr, sizeof(server_addr));
    if (iRet < 0) {                                                     /*  绑定套接字和本地IP地址和端口                          */
        close(iSockFd);
        printf("error: bind error\n");
        return (PX_ERROR);
    }

    if (listen(iSockFd, BACK_LOG) < 0) {                                /*  监听                                                                            */
        close(iSockFd);
        printf("error: listen socket error\n");
        return (PX_ERROR);
    }

    if ((iConnfd = accept(iSockFd, (struct sockaddr *)NULL, NULL)) == -1) {
        close(iSockFd);                                                 /*  等待客户端请求                                                        */
        printf("error: accept error\n");
        return (PX_ERROR);
    }

    int count = 0;
    while (1) {                                                         /*  循环接收数据                                                            */

        memset(cBuf, 0, BUFFSIZE);
        iRet = read(iConnfd, cBuf, BUFFSIZE);
        if (iRet) {
        	count++;
        } else {
        	printf("------------------------count=%d-------------------------\n", count);
            break;
        }
    }

    close(iSockFd);                                                     /*  关闭套接字                                                                */
    return 0;
}

2.2客户端代码

/*********************************************************************************************************
**
**                                    中国软件开源组织
**
**                                   嵌入式实时操作系统
**
**                                       SylixOS(TM)
**
**                               Copyright  All Rights Reserved
**
**--------------文件信息--------------------------------------------------------------------------------
**
** 文   件   名: tcp_client.c
**
** 创   建   人: Chen
**
** 文件创建日期: 2020 年 12 月 15 日
**
** 描        述: 测试TCP协议客户端模式收发功能
*********************************************************************************************************/
#include "test_common.h"
/*********************************************************************************************************
** 函数名称: tcpClient
** 功能描述: 测试TCP协议客户端模式收发功能
** 输 入  : NONE
** 输 出  : NONE
*********************************************************************************************************/
INT main (VOID)
{
    INT                 iRet;
    INT                 iSockfd;

    int p;
    struct sockaddr_in  server_addr;

    struct timespec tp1;
    struct timespec tp2;
    double ms1;
    double ms2;
    double totalMs;
    double throughputAve = 0.0;
    const int nPackgeCount = 20000;                                     /*  循环发包20000次                                                 */
    const int nStrSize=4096;                                            /*  包大小4096                    */

    char * str = malloc(nStrSize);
    memset(str, 'a', nStrSize);


    fprintf(stdout, "----------TCP client start.----------\n");

    iSockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);                /*  创建套接字                                                                */

    if (iSockfd < 0) {
        printf("error: socket error\n");
        return (PX_ERROR);
    }

    memset(&server_addr, 0, sizeof(server_addr));

    server_addr.sin_family      = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);                 /*  服务器端IP地址                                                      */
    server_addr.sin_port        = htons(SERVER_PORT);                   /*  服务器端口号                                                            */

    iRet = connect(iSockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
    if (iRet < 0) {                                                     /*  向服务器发送连接请求                                            */
        fprintf(stderr, "error: connect error [%s]\n", lib_strerror(errno));
        close(iSockfd);
        return (PX_ERROR);
    }

    clock_gettime(CLOCK_REALTIME, &tp1);                                /*  获取当前时间tp1                 */
    ms1 = ((double)tp1.tv_sec)*1000.0 + ((double)tp1.tv_nsec)/1000000.0;

    for (p=0; p<nPackgeCount; p++) {                                    /*  客户端20000次发包      包大小4096     */

        iRet = send(iSockfd, str, nStrSize, 0);
        if (iRet < 0) {
            printf("error: send data error\n");
            close(iSockfd);
            return (PX_ERROR);
        }
    }

    clock_gettime(CLOCK_REALTIME, &tp2);                                /*  获取当前时间tp2                 */
    ms2 = ((double)tp2.tv_sec)*1000.0 + ((double)tp2.tv_nsec)/1000000.0;
    totalMs = ms2-ms1;                                                  /*  获取20000次发包时间                                         */

    printf("----------------------[%d]----------------------\n",nStrSize);

    free(str);                                                          /*  释放申请空间                                                            */

    close(iSockfd);                                                     /*  关闭套接字                                                                */

    return  (0);
}

头文件test_common.h:

/*********************************************************************************************************
**
**                                    中国软件开源组织
**
**                                   嵌入式实时操作系统
**
**                                       SylixOS(TM)
**
**                               Copyright  All Rights Reserved
**
**--------------文件信息--------------------------------------------------------------------------------
**
** 文   件   名: test_common.h
**
** 创   建   人: 
**
** 文件创建日期: 2017 年 1 月 10 日
**
** 描        述: 网卡测试配置
*********************************************************************************************************/
#ifndef TEST_COMMON_H_
#define TEST_COMMON_H_

/*********************************************************************************************************
** 包含头文件
*********************************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
#include <net/if.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <pthread.h>
#include <time.h>

/*********************************************************************************************************
**  测试模式选择宏
*********************************************************************************************************/
#define   TCP_CLIENT_MODE           1                                   /* 测试tcp客户端模式            */
#define   TCP_SEVER_MODE            2                                   /* 测试tcp服务器模式            */
#define   UDP_CLIENT_MODE           3                                   /* 测试udp客户端模式            */
#define   UDP_SEVER_MODE            4                                   /* 测试udp服务器模式            */
#define   POSIX_MODE                5                                   /* 测试POSIX标准接口            */
#define   ICTOL_MODE                6                                   /* 测试ictol                    */
#define   UDP_SEND_SPEED_MODE       7                                   /* 测试UDP下发送速度            */
#define   UDP_RECV_SPEED_MODE       8                                   /* 测试UDP下接受速度            */
#define   TCP_PRESSURE_MODE         9                                   /* 测试UDP下接受速度            */


/*********************************************************************************************************
**  网络IO配置宏
*********************************************************************************************************/
#define   IFNAME                    "en1"                               /* 网络接口名                   */
#define   STOP_DHCP                 0                                   /* 停用DHCP                     */
#define   UP_DHCP                   1                                   /* 启动DHCP                     */


/*********************************************************************************************************
**  TCP客户端配置宏
*********************************************************************************************************/
#define SERVER_IP                   "127.0.0.1"
#define SERVER_PORT                 (8000)
#define BUFF_SIZE                   (4 * SIZE_K)

/*********************************************************************************************************
**  TCP服务器配置宏
*********************************************************************************************************/
#define PORT                        (8000)
#define BUFFSIZE                    (16384)
#define BACK_LOG                    (2)                                 /* 接受最大连接数               */

/*********************************************************************************************************
**  测速通用全局变量
*********************************************************************************************************/
#define FIRST_RECV                  0                                   /* 服务器第一次接受             */
#define SIZE_K                      (4096)
#define SIZE_M                      (1024 * 1024)
#define UDP_SPEED_BUFF_SIZE_SERVER  (15 * SIZE_K)
CHAR    cRecvBuff[UDP_SPEED_BUFF_SIZE_SERVER];                          /* 接受缓冲区                   */



#endif /* TEST_COMMON_H_ */

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值