⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netdemo.c

📁 基于实时嵌入式操作系统的Reworks的TCP、UDP程序
💻 C
字号:
#include <stdio.h>
#include <string.h>
#include <rtos.h>
#include <ucore/error.h>
#include <ucore/rtos_bsdnet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define STD_IN 0

#define TCP_PORT 5000				/*端口号*/
#define UDP_PORT 5001
#define MAX_CONNECTIONS 4		/*同时连接的最大客户端数*/
#define MSG_SIZE 100			/*信息长度*/

void tcpServerTask(void* arg)
{
	int fd = (int)arg;
	char msg[MSG_SIZE];
	int n;
	OS_STATUS sc;
	
	memset(msg , 0, MSG_SIZE);
	
	if(	(n = recv(fd, msg, sizeof(msg), 0)) > 0)
		printf("Recv: %s \n", msg);
	else
		perror("recv");
		
	close (fd);
	
	sc = OSTaskDelete(OS_SELF);
	if (sc != OS_OK)	{
		printf("Can't delete task \n");
		return;
	}
}

void tcpServer(void* arg)
{
	struct sockaddr_in myAddr, farAddr;
	int sFd, newFd;
	int sockAddrSize;
	
	unsigned32 tid;
	unsigned32 my_priority;
	OS_STATUS sc;
	
	if((sFd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
		perror("socket");
		return;
	}
	
	myAddr.sin_family = AF_INET;
	myAddr.sin_port = htons (TCP_PORT); 
	myAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	
	if (bind (sFd, (struct sockaddr *)&myAddr, sizeof(myAddr)) < 0)
	{
		perror("bind");
		close(sFd);
		return;
	}
	
	if (listen (sFd, MAX_CONNECTIONS) < 0)
	{
		perror("listen");
		close(sFd);
		return;
	}
	
	for(; ;)	{
		sockAddrSize = sizeof(farAddr);
		if((newFd = accept(sFd, (struct sockaddr *)&farAddr, &sockAddrSize)) < 0)
		{
			perror("accept");
			close(sFd);
			return;
		}
		else
			printf("ACCEPTED:%s\n", inet_ntoa(farAddr.sin_addr));
		
		/*spawn task*/
		
		OSTaskPriSet(OS_SELF, OS_CURRENT_PRI, &my_priority);
		sc = OSTaskCreate("tcpServerTask",
			my_priority,
			8*1024,
			OS_PREEMPT|OS_NO_TIMESLICE|OS_NO_ASR|OS_INTERRUPT_LEVEL(0),
			OS_NO_FP|OS_LOCAL,
			&tid);
		if (sc != OS_OK)	{
			printf("Can't create task \n");
			return;
		}
		
		sc = OSTaskStart(tid, tcpServerTask, newFd);
		if (sc != OS_OK)	{
			printf("Can't start task \n");
			return;
		}
		
	}
}

void tcpClient(void)
{
	struct sockaddr_in serverAddr;
	int sFd;
	int sockAddrSize;
	char sendBuf[MSG_SIZE] = "This a message from tcpClient";

	
	if((sFd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
		perror("socket");
		return;
	}
	sockAddrSize = sizeof(struct sockaddr_in);
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_port = htons (TCP_PORT); 
	serverAddr.sin_addr.s_addr = inet_addr("10.0.5.55");
	
	if(connect(sFd, (struct sockaddr *)&serverAddr, sockAddrSize) < 0)
	{
		perror("connect");
		close(sFd);
		return;
	}
		
	if(send(sFd, sendBuf, sizeof(sendBuf), 0) < 0)
	{
		perror("send");
		close(sFd);
		return;
	}
		
	close(sFd);
}


void udpServer(void* arg)
{
	struct sockaddr_in serverAddr, clientAddr;
	int sockAddrSize;
	int sFd;
	char recvBuf[MSG_SIZE];
	
	if((sFd = socket(AF_INET,SOCK_DGRAM, 0)) < 0)
	{
		perror("socket");
		return;
	}
	
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_port = htons(UDP_PORT);
	serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	
	sockAddrSize = sizeof(struct sockaddr_in);
	
	if(bind(sFd, (struct sockaddr *)&serverAddr, sockAddrSize) < 0)
	{
		perror("bind");
		close(sFd);
		return;
	}
	
	for(; ;)	{
		if(recvfrom(sFd, recvBuf, sizeof(recvBuf), 0, 
				(struct sockaddr *)&clientAddr, &sockAddrSize) < 0)
		{
			perror("recvfrom");
			close(sFd);
			return;
		}
		else 
			printf("RECV: %s \n", recvBuf);
		
	}
	
}

void udpClient(void)
{
	struct sockaddr_in serverAddr;
	int sockAddrSize;
	int sFd;
	char sendBuf[MSG_SIZE] = "This a message from udpClient";
	
	if((sFd = socket(AF_INET,SOCK_DGRAM, 0)) < 0)
	{
		perror("socket");
		return;
	}
	
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_port = htons(UDP_PORT);
	serverAddr.sin_addr.s_addr = inet_addr("10.0.5.55");
	
	sockAddrSize = sizeof(struct sockaddr_in);
	
	if(sendto(sFd, sendBuf, sizeof(sendBuf), 0, 
			(struct sockaddr *)&serverAddr, sockAddrSize) < 0)
	{
		perror("sendto");
		close(sFd);
		return;
	}
	
	close(sFd);
}


void doSock(void)
{
		unsigned32 tid1, tid2;
		unsigned32 my_priority;
		OS_STATUS sc;
		
		/*spawn tcpserver task*/
		
		OSTaskPriSet(OS_SELF, OS_CURRENT_PRI, &my_priority);
		sc = OSTaskCreate("tcpServer",
			my_priority,
			8*1024,
			OS_PREEMPT|OS_NO_TIMESLICE|OS_NO_ASR|OS_INTERRUPT_LEVEL(0),
			OS_NO_FP|OS_LOCAL,
			&tid1);
		if (sc != OS_OK)	{
			printf("Can't create task \n");
			return;
		}
		
		sc = OSTaskStart(tid1, tcpServer, 0);
		if (sc != OS_OK)	{
			printf("Can't start task \n");
			return;
		}
		
		/*spawn udpserver task*/
		
		sc = OSTaskCreate("udpServer",
			my_priority,
			8*1024,
			OS_PREEMPT|OS_NO_TIMESLICE|OS_NO_ASR|OS_INTERRUPT_LEVEL(0),
			OS_NO_FP|OS_LOCAL,
			&tid2);
		if (sc != OS_OK)	{
			printf("Can't create task \n");
			return;
		}
		
		sc = OSTaskStart(tid2, udpServer, 0);
		if (sc != OS_OK)	{
			printf("Can't start task \n");
			return;
		}

		
		for(;;)	{
			switch(getchar())	{
				case 'q':
					return;
				case 't':
					tcpClient();
					break;
				case 'u':
					udpClient();
					break;
				case 's':
					rtos_bsdnet_show_if_stats();
					break;
			}
		}
			
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -