Linux_C例程(Socket)

这几天学习了linux环境下的socket 编程, 做了一些整理。

1. 代码如下:

/**
* @file	 socket_test.c
* @note
* @brief  网络C/S通信例程
* @author 
* @date	 2022/03/31
* @note :
* @note \n History:
	 1.Date			: 2022/03/31
	 Author 		: LianXiang
	 Modification : 创建文件
*/

/* ========================================================================== */
/*								   头文件					   				  */
/* ========================================================================== */
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <errno.h>
#include <signal.h>
#include <errno.h>
#include <stdlib.h>

/* ========================================================================== */
/*								   宏定义									  */
/* ========================================================================== */
#define SERVER_IP				"127.0.0.1"  /* 根据不同的环境 修改SERVER_IP */
#define SERVER_PORT 			5001
#define LISTEN_BACKLOG			50

#define handle_error(msg)\
		do { perror(msg); exit(EXIT_FAILURE); } while (0)

/* ========================================================================== */
/*								   函数声明 									  */
/* ========================================================================== */
void ServerProcess(void);
void ClientProcess(void);

/**
* main
* @brief	  主函数
* @param[in]  int argc
* @param[in]  char *argv[]
* @param[out] void
* @return		 0
*/
int main(int argc, char * argv[])
{
	if (argc != 2) {
		printf("Usage: %s client or server\n", argv[0]);
		return - 1;
	}

	/* 根据执行的参数,	执行 client 或 server 进程 */
	if (0 == memcmp(argv[1], "client", sizeof("client"))) {
		ClientProcess();
	} else if (0 == memcmp(argv[1], "server", sizeof("server"))) {
		ServerProcess();
	} else {
		printf("Usage: %s client or server\n", argv[0]);
	}

	return 0;
}

/**
* ServerProcess
* @brief	  服务器进程处理进程
* @param[in]  void
* @param[out] void
* @return	  void	
*/
void ServerProcess(void)
{
	int serverSockfd = -1;
	int acceptSockfd = -1;
	socklen_t addrLen = 0;
	char recvBuf[1024] = {0};
	int recvLen = 0;

	struct sockaddr_in tSocketServerAddr;
	struct sockaddr_in tSocketClientAddr;

	/* 调用 signal(SIGCHLD,SIG_IGN) 则子进程结束后,不再给父进程发送信号。
		由内核负责回收,防止子进程变为僵尸进程 */
	signal(SIGCHLD, SIG_IGN);

	tSocketServerAddr.sin_family = AF_INET;
	tSocketServerAddr.sin_port = htons(SERVER_PORT);
	tSocketServerAddr.sin_addr.s_addr = htons(INADDR_ANY);

	/* 1. 创建socket */
	serverSockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (-1 == serverSockfd) {
		handle_error("socket");
	}

	/* 2. 绑定socket	 */
	if (-1 == bind(serverSockfd, (struct sockaddr *) &tSocketServerAddr, sizeof(struct sockaddr_in))) {
		handle_error("bind");
	}

	/* 3. 监听   */
	if (-1 == listen(serverSockfd, LISTEN_BACKLOG)) {
		handle_error("listen");
	}

	while (1) {
		addrLen = sizeof(struct sockaddr);
		acceptSockfd = accept(serverSockfd, (struct sockaddr *) &tSocketClientAddr, &addrLen);

		if (-1 != acceptSockfd) {
			printf("Connected Client IP : %s  \n", inet_ntoa(tSocketClientAddr.sin_addr));
			printf("Waiting client send message...\n");

			/* 创建子进程,用于多个client连接	*/
			if (0 == fork()) {
				while (1) {
					/* 阻塞接收客户端数据, 收到后返回,并打印 */
					recvLen = recv(acceptSockfd, recvBuf, 1023, 0);

					if (recvLen <= 0) {
						close(acceptSockfd);
						return;
					} else {
						recvBuf[recvLen] = '\0';
						printf("Client: %s\n", recvBuf);
					}
				}
			}
		} else {
			handle_error("accept");
		}
	}

	close(serverSockfd);
	serverSockfd = -1;
}

/**
* ClientProcess
* @brief	  客户端进程处理进程
* @param[in]  void
* @param[out] void
* @return	  void	
*/
void ClientProcess(void)
{
	int clientSockfd = -1;

	struct sockaddr_in socketServerAddr;
	char sendBuf[1024] = {0};
	int sendLen = 0;

	/* 1. 创建socket	 */
	clientSockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (-1 == clientSockfd) {
		handle_error("socket");
	}

	socketServerAddr.sin_family = AF_INET;
	socketServerAddr.sin_port = htons(SERVER_PORT); /* host to net, short */

	/* 2. 转换server ip为网络字节序	 */
    if (0 == inet_aton(SERVER_IP, &socketServerAddr.sin_addr)) {
		printf("Server ip error\n");
		return;
	}

	/* 3. 连接server	 */
	if (-1 == connect(clientSockfd, (const struct sockaddr *) &socketServerAddr, sizeof(struct sockaddr))) {
		handle_error("connect");
	} else {
		printf("Connect success.\nPlease input message:\n");
	}

	/* 4. 循环输入内容,并发送给server */
	while (1) {
		if (fgets(sendBuf, 1023, stdin)) {
			sendLen = send(clientSockfd, sendBuf, strlen(sendBuf), 0);

			if (sendLen <= 0) {
				close(clientSockfd);
				return;
			}
		}
	}
}

2. 运行步骤

1. 编译

gcc -o socket_test socket_test.c

2. 运行server端

 ./socket_test server

3. 运行client端

 新开一个回话窗口,运行client

./socket_test client

4. client发送任意数据, server端可以显示

server端运行

client端运行

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: dma_performance_demo是一个用于演示DMA性能的示例程序,用于测试DMA传输的速度和效率。 首先,你需要将该示例程序下载到你的开发板或芯片上。然后,根据你使用的开发环境,打开项目文件。 在示例程序中,你可以看到有几个主要的函数和变量。首先是初始化函数,它用于配置DMA控制器和其他必要的寄存器。你需要根据你的硬件平台和需求进行相应的配置。 然后是主要的演示函数,它会执行一系列的DMA传输操作。在这个函数中,你可以看到通过DMA传输数据的过程,包括设置源地址和目的地址,设置传输长度等。 在执行DMA传输之前,你可以选择先填充源数据,以模拟实际的应用场景。然后,通过调用DMA传输函数,开始进行DMA传输。 在传输完成后,你可以通过比较源数据和目的数据来验证传输的正确性。通过计算传输时间和传输速度,你可以评估DMA传输的性能。 最后,记得在程序结束时释放DMA资源,并根据需要进行清理工作。 总结来说,使用dma_performance_demo例程,你需要进行硬件的配置和初始化,设置传输的源地址和目的地址,进行数据的填充和传输,验证传输的正确性,并评估DMA传输的性能。这个例程对于测试和优化DMA传输效率非常有帮助。 ### 回答2: dma_performance_demo例程是一个用于测试DMA性能的示例程序。下面是如何使用它的步骤: 1. 首先,您需要在您的开发环境中打开dma_performance_demo例程的源代码文件。您可以在SDK中找到这个例程的文件夹。 2. 打开源代码文件后,您会看到示例程序的主要函数和一些设置。 3. 在主函数中,您可以通过修改一些参数来配置DMA的工作方式。例如,您可以更改源地址和目标地址,以及要传输的数据大小。 4. 配置好参数后,您可以执行示例程序,以便开始测试DMA的性能。 5. 示例程序将开始执行DMA传输,并计算DMA传输所需的时间。 6. 一旦DMA传输完成,示例程序会将传输所需的时间以及传输速度打印出来。 7. 您可以根据打印出来的结果来评估DMA的性能。 请注意,使用dma_performance_demo例程测试DMA性能时,您应该根据您的具体硬件和应用场景进行适当的参数配置。此外,示例程序还可能提供其他有用的函数或方法来进行更详细的性能测试和评估。 这就是如何使用dma_performance_demo例程来测试DMA性能的基本步骤。希望这个回答对您有帮助。 ### 回答3: dma_performance_demo是一个用于测试DMA性能的示例程序。它提供了一种简单的方法来测试DMA传输的速度和效率。 使用dma_performance_demo可以按照以下步骤进行操作: 1. 确保你的开发板中包含DMA控制器和相应的外设模块,这些模块可以进行DMA传输。参考开发板的用户手册以了解是否支持DMA功能。 2. 下载和编译dma_performance_demo源代码,并将生成的可执行文件烧录到你的开发板中。 3. 运行dma_performance_demo程序。在程序启动后,它将提示你选择DMA传输的方向(从外设到存储器,或者从存储器到外设)。根据你的需求选择相应的选项。 4. 程序执行后,它将开始进行DMA传输,并在完成后显示传输所花费的时间和传输速度。 5. 你可以根据实际的需求,调整示例程序中的参数,比如传输数据的长度、存储器和外设的地址等,来测试不同情况下的DMA性能。 注意事项: - 在使用dma_performance_demo时,确保你已经正确配置了DMA控制器和外设,以确保DMA传输的正常运行。 - 根据你的开发板和外设的特性,可能需要进行额外的设置和配置。参考相关文档和资料,确保你的系统正确地支持DMA传输。 - DMA传输的性能受到多个因素的影响,包括硬件设计、数据长度、传输方向等。因此,在测试和评估DMA性能时,你可能需要进行多次测试,并对结果进行平均和比较。 总之,dma_performance_demo是一个用于测试DMA性能的示例程序,通过按照上述步骤使用它,你可以评估DMA传输的速度和效率,并对系统进行相应的优化和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值