编写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_ */