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

📄 main.c

📁 这是TCP/IP协议组播的实现代码
💻 C
📖 第 1 页 / 共 2 页
字号:

/********************** 此程序为IP视频会议终端C400程序 ************************/

/*************************** main.c 为系统主程序 ******************************/

/**************************** designed by wangxq    ***************************/

/****************************      2006-02-23       ***************************/

#include <stdio.h>               
#include <string.h>              
#include "user.h"
#include "rom400_init.h"
#include "rom400_task.h"
#include "rom400_sock.h"

#ifdef USE_KMEM_LIB
#include "rom400_kmem.h"
#endif
#ifdef USE_XNETSTACK_LIB
#include "rom400_xnetstack.h"
#endif

void main()
{
	unsigned int i;
	#ifdef USE_XNETSTACK_LIB
    	xnetstack_install();
	#endif

	#ifdef USE_KMEM_LIB
	    kmem_install(ROM400_KMEM_MODEL_SMALLEST + 2);
	#endif


	init_rom(RAM_START, RAM_END);
	//系统存储器的初始化,为ROMINIT.LIB的函数,完成对外接的存储器定标和分配地址  
    
	clear_param_buffers();

 	
	#ifdef USE_XNETSTACK_LIB
    	printf("DS80C400 Enhanced Network Library Version %d\r\n", xnetstack_version());
	#endif

	#ifdef USE_KMEM_LIB
    	printf("DS80C400 KMEM Library Version             %d\r\n", kmem_version());
	#endif

    puts("Timing test...please wait.\r\n");
    printf("Reload : %x\r\n", task_gettickreload());

	init();//自己定义的函数,初始化自己定义的变量

	puts("Wait IpAddress And Other Information");

	
	/*********************** 获取网络参数 ***********************/

	temp = 0;
	while(temp == 0)
	{
		temp = (*dual_ip) & 0x01;

		for(i = 0;i < 3;i++)
		{
			verify[i] = *(dual_ip + i + 65);	
		}

		if((temp == 0x01) && (verify[0] == 0xaa) &&
		(verify[1] == 0xbb) && (verify[2] == 0xcc))
		{
			temp = 1;	
		}
		else
		{
			temp = 0;
		}
	}

	for(i = 0;i < 4;i++)
	{
		static_ip[i] = *(dual_ip + 1 + i);//获取自己的IP
		*(send_addr_command + i + 1) = static_ip[i];
	}
	for(i = 0;i < 4;i++)
	{
		yan_ma[i] = *(dual_ip + 5 + i);//获取子网掩码
	}
	for(i = 0;i < 4;i++)
	{
		gate_ip[i] = *(dual_ip + 9 + i);//获取网关
	}

	REV_VIDEO_PORT = (*(dual_ip + 14)) & 0xff;//获取视频接收端口号
	REV_VIDEO_PORT = REV_VIDEO_PORT + (((*(dual_ip + 13)) & 0xff) << 8);
	printf("REV_VIDEO_PORT : %u \r\n", REV_VIDEO_PORT);

	SEND_VIDEO_PORT = (*(dual_ip + 16)) & 0xff;//获取视频发送端口号
	SEND_VIDEO_PORT = SEND_VIDEO_PORT + (((*(dual_ip + 15)) & 0xff) << 8);
	printf("SEND_VIDEO_PORT : %u \r\n", SEND_VIDEO_PORT);

	REV_COMMAND_PORT = (*(dual_ip + 18)) & 0xff;//获取命令字接收端口号
	REV_COMMAND_PORT = REV_COMMAND_PORT + (((*(dual_ip + 17)) & 0xff) << 8);
	printf("REV_COMMAND_PORT : %u \r\n", REV_COMMAND_PORT);

	SEND_COMMAND_PORT = (*(dual_ip + 20)) & 0xff;//获取命令字发送端口号
	SEND_COMMAND_PORT = SEND_COMMAND_PORT + (((*(dual_ip + 19)) & 0xff) << 8);
	printf("SEND_COMMAND_PORT : %u \r\n", SEND_COMMAND_PORT);

	REV_G711_PORT = (*(dual_ip + 22)) & 0xff;//获取音频接收端口号
	REV_G711_PORT = REV_G711_PORT + (((*(dual_ip + 21)) & 0xff) << 8);
	printf("REV_G711_PORT : %u \r\n", REV_G711_PORT);

	SEND_G711_PORT = (*(dual_ip + 24)) & 0xff;//获取音频发送端口号
	SEND_G711_PORT = SEND_G711_PORT + (((*(dual_ip + 23)) & 0xff) << 8);
	printf("SEND_G711_PORT : %u \r\n", SEND_G711_PORT);

	for(i = 0;i < 4;i++)
	{
		send_para[0][i] = *(dual_ip + 25 + i);//获取第一发送地址
	}
	printf("First send IP : %bu %bu %bu %bu\r\n", send_para[0][0], send_para[0][1],send_para[0][2], send_para[0][3]);

	for(i = 0;i < 4;i++)
	{
		rev_para_video[0][i] = *(dual_ip + 29 + i);//获取第一视频接收地址
	}
	printf("First receive video IP : %bu %bu %bu %bu\r\n", rev_para_video[0][0], rev_para_video[0][1],rev_para_video[0][2], rev_para_video[0][3]);

	for(i = 0;i < 4;i++)
	{
		rev_para_audio[0][i] = *(dual_ip + 33 + i);//获取第一音频接收地址
	}
	printf("First receive audio IP : %bu %bu %bu %bu\r\n", rev_para_audio[0][0], rev_para_audio[0][1],rev_para_audio[0][2], rev_para_audio[0][3]);

	for(i = 0;i < 4;i++)
	{
		send_para[1][i] = *(dual_ip + 37 + i);//获取第二发送地址
	}
	printf("Second send IP : %bu %bu %bu %bu\r\n", send_para[1][0], send_para[1][1],send_para[1][2], send_para[1][3]);
	
	for(i = 0;i < 4;i++)
	{
		rev_para_video[1][i] = *(dual_ip + 41 + i);//获取第二视频接收地址
	}
	printf("Second receive video IP : %bu %bu %bu %bu\r\n", rev_para_video[1][0], rev_para_video[1][1],rev_para_video[1][2], rev_para_video[1][3]);

	for(i = 0;i < 4;i++)
	{
		rev_para_audio[1][i] = *(dual_ip + 45 + i);//获取第二音频接收地址
	}
	printf("Second receive audio IP : %bu %bu %bu %bu\r\n", rev_para_audio[1][0], rev_para_audio[1][1],rev_para_audio[1][2], rev_para_audio[1][3]);

	for(i = 0;i < 4;i++)
	{
		send_para[2][i] = *(dual_ip + 49 + i);//获取第三发送地址
	}
	printf("Third send IP : %bu %bu %bu %bu\r\n", send_para[2][0], send_para[2][1],send_para[2][2], send_para[2][3]);	

	for(i = 0;i < 4;i++)
	{
		rev_para_video[2][i] = *(dual_ip + 53 + i);//获取第三视频接收地址
	}
	printf("Third receive video IP : %bu %bu %bu %bu\r\n", rev_para_video[2][0], rev_para_video[2][1],rev_para_video[2][2], rev_para_video[2][3]);

	for(i = 0;i < 4;i++)
	{
		rev_para_audio[2][i] = *(dual_ip + 57 + i);//获取第三视频接收地址
	}
	printf("Third receive audio IP : %bu %bu %bu %bu\r\n", rev_para_audio[2][0], rev_para_audio[2][1],rev_para_audio[2][2], rev_para_audio[2][3]);

	for(i = 0;i < 4;i++)
	{
		send_para[3][i] = *(dual_ip + 61 + i);//获取第四发送地址
	}
	printf("Four send IP : %bu %bu %bu %bu\r\n", send_para[3][0], send_para[3][1],send_para[3][2], send_para[3][3]);	

	*dual_ip = 0;
	for(i = 0;i < 3;i++)
	{
		*(dual_ip + i + 65) = 0;	
	}
	 
	/*********************** 获取网络参数 ***********************/
	
	task_settickreload(RELOAD_73_728);//装载任务调度定时器的初值

    puts("About to wait 20...");

    printf("Reload : %x\r\n", task_gettickreload()); 

	do_static();//设置本地IP地址属性(包括IP、网关等)

    network_config();//读取并打印设置参数


	/********************** 创建发送连接 *************************/	

	video_sendhandle = socket(0, SOCKET_TYPE_DATAGRAM, 0);//创建UDP视频发送连接


	g711_sendhandle = socket(0, SOCKET_TYPE_DATAGRAM, 0);//创建UDP音频发送连接

	/*****************创建UDP命令字发送连接***********************/

	memset(&send_udp_command, 0, sizeof(struct sockaddr));
    send_udp_command.sin_addr[12] = send_para[3][0];
    send_udp_command.sin_addr[13] = send_para[3][1];
    send_udp_command.sin_addr[14] = send_para[3][2];
    send_udp_command.sin_addr[15] = send_para[3][3];

    send_udp_command.sin_port = SEND_COMMAND_PORT;

	command_sendhandle = socket(0, SOCKET_TYPE_DATAGRAM, 0);//创建UDP命令字发送连接

	if(command_sendhandle ==  0x0FFFF)
     	puts("\r\n Failed to create command send UDP socket \r\n");
    else
	{
        puts("\r\n Succeed to create command send UDP socket \r\n");
	}

	syn_setDatagramAddress(command_sendhandle, 1, &send_udp_command);//设置UDP命令字发送连接地址

	/*****************创建UDP命令字发送连接***********************/

	/******************** 创建发送连接 ***************************/	

	/******************** 创建接收连接 ***************************/	

	/******************创建UDP视频接收连接************************/

	memset(&rev_udp_video, 0, sizeof(struct sockaddr));
    rev_udp_video.sin_addr[12] = static_ip[0];
    rev_udp_video.sin_addr[13] = static_ip[1];
    rev_udp_video.sin_addr[14] = static_ip[2];
    rev_udp_video.sin_addr[15] = static_ip[3];

    rev_udp_video.sin_port = REV_VIDEO_PORT;

	video_revhandle = socket(0, SOCKET_TYPE_DATAGRAM, 0);//创建UDP接收命令字连接

	if(video_revhandle ==  0x0FFFF)
     	puts("\r\n Failed to create receive video UDP socket \r\n");
    else
        puts("\r\n Succeed to create receive video UDP socket \r\n");

	if(bind(video_revhandle,&rev_udp_video,sizeof(struct sockaddr)) == 0)//绑定命令字接收地址和端口
        printf(" successully bind receive video address and port - %u\r\n",REV_VIDEO_PORT);
    else
        printf(" failed to bind receive video address and port \r\n");

	/******************创建UDP视频接收连接************************/


	/******************创建UDP音频接收连接************************/

	memset(&rev_udp_audio, 0, sizeof(struct sockaddr));
    rev_udp_audio.sin_addr[12] = static_ip[0];
    rev_udp_audio.sin_addr[13] = static_ip[1];
    rev_udp_audio.sin_addr[14] = static_ip[2];
    rev_udp_audio.sin_addr[15] = static_ip[3];

    rev_udp_audio.sin_port = REV_G711_PORT;

	g711_revhandle = socket(0, SOCKET_TYPE_DATAGRAM, 0);//创建UDP接收命令字连接

	if(g711_revhandle ==  0x0FFFF)
     	puts("\r\n Failed to create receive audio UDP socket \r\n");
    else
        puts("\r\n Succeed to create receive audio UDP socket \r\n");
	

	if(bind(g711_revhandle,&rev_udp_audio,sizeof(struct sockaddr)) == 0)//绑定命令字接收地址和端口
    {	
		printf(" successully bind receive audio address and port - %u\r\n",REV_G711_PORT);
    }
	else
	{
        printf(" failed to bind receive audio address and port \r\n");
	}

	/******************创建UDP音频接收连接************************/

	
	/******************创建UDP命令接收连接************************/

	memset(&rev_udp_command, 0, sizeof(struct sockaddr));
    rev_udp_command.sin_addr[12] = static_ip[0];
    rev_udp_command.sin_addr[13] = static_ip[1];
    rev_udp_command.sin_addr[14] = static_ip[2];
    rev_udp_command.sin_addr[15] = static_ip[3];

    rev_udp_command.sin_port = REV_COMMAND_PORT;

	command_revhandle = socket(0, SOCKET_TYPE_DATAGRAM, 0);//创建UDP接收命令字连接

	if(command_revhandle ==  0x0FFFF)
     	puts("\r\n Failed to create receive command UDP socket \r\n");
    else
        puts("\r\n Succeed to create receive command UDP socket \r\n");

	if(bind(command_revhandle,&rev_udp_command,sizeof(struct sockaddr)) == 0)//绑定命令字接收地址和端口
        printf(" successully bind receive command address and port - %u\r\n",REV_COMMAND_PORT);
    else
        printf(" failed to bind receive command address and port \r\n");
	
	syn_setDatagramAddress(command_revhandle, 0, &rev_udp_command);	

	/******************创建UDP命令接收连接************************/


	/******************** 创建接收连接 ***************************/	
	
	start_leave();

	task_entercritsection();   
    
	result = task_fork(NORM_PRIORITY, ROM_SAVESIZE);//创建两个任务线程
    
	if (result==0x0FFFF)//创建任务失败
    {
        task_leavecritsection();
        puts("Attempt to fork failed\r\n");
        return;
    }
	else if (result==0)//发送线程
    {
        while (1)
		{
			temp = *(dual_ip + 0x44);
			if(temp == 0x01)
			{
				task_entercritsection();
				para_l = *(dual_ip + 0x45);
				para_h = *(dual_ip + 0x46);
				analyse_current_state(para_l,para_h);
				*(dual_ip + 0x44) = 0;
				task_leavecritsection();
			}

			temp = ((*rd_fifo_ef) & 0x01);
			if(temp == 1)//检测视频FIFO是否为空
			{
				dp_read_video();
				if(send_video_flag != 0xff)
				{
					syn_sendto(video_sendhandle, 1472, send_addr_video);//UDP发送视频数据
				}
			}

			temp = ((*rd_fifo_hf) & 0x01);
			if(temp == 0)//检测音频FIFO是否半满
			{
				dp_read_audio();//读取音频数据
				if(send_audio_flag != 0xff)
				{
					syn_sendto(g711_sendhandle, 1024, send_addr_audio);//UDP发送音频数据
				}
			}

			temp = ((*dual_rev) & 0x01);
			if(temp == 0x01)//判断是否有命令字需要发送
			{					
				command_length = *(dual_rev + 1);
				for(i = 0; i < command_length;i++)
				{
					*(send_addr_command + i + 5) = (*(dual_rev + 2 + i) & 0xff);
				}
				*dual_rev = 0;
				command_length = command_length + 5;
				*(send_addr_command) = command_length;//将从双口RAM中取出的命令字打包
				syn_sendto(command_sendhandle,command_length,send_addr_command);//UDP发送命令字
			}
			if(rev_video_flag == 0xff)
			{
				task_wait(0, 0, 18);//线程挂起,进入等待
			}
			else
			{
				task_wait(0, 0, 16);//线程挂起,进入等待
			}
		}
    }
    else 
    {
		command_result = task_fork(NORM_PRIORITY, ROM_SAVESIZE);//创建两个任务线程
		if(command_result == 0xffff)
		{
			puts("Attempt to fork failed\r\n");
        	return;
		}
		else if(command_result == 0)//接收视频数据线程
		{
			while (1)
			{
        		rev_length_video = syn_recvfrom(video_revhandle,1472,rev_addr_video);//UDP接收视频数据
				if(rev_length_video == 1472)
				{
					dp_write_video();
				}
			}
		}
		else
		{
			audio_result = task_fork(NORM_PRIORITY, ROM_SAVESIZE);//创建两个任务线程
			if(audio_result == 0xffff)
			{
				puts("Attempt to fork failed\r\n");
        		return;
			}
			else if(audio_result == 0)//接收音频线程
			{
				while(1)
				{
					rev_length_audio = syn_recvfrom(g711_revhandle,1024,rev_addr_audio);//UDP音频接收
					//rev_length_audio = recvfrom(g711_revhandle,rev_addr_audio,1024,0,&temp_addr,sizeof(struct sockaddr));//UDP音频接收
					if(rev_length_audio == 1024)
					{
						dp_write_audio();
						//printf("IP : %bu \r\n", temp_addr.sin_addr[15]);
						//temp_addr.sin_addr[15] = 0;
					}
				}
			}
			else//接收命令字线程
			{
				task_leavecritsection();
				while (1)
				{
					rev_length_command = syn_recvfrom(command_revhandle,210, rev_addr_command);//UDP接收
					if((rev_length_command < 210) && (rev_length_command > 0))
					{
						moveto_buf();//将网络接收到的命令字放入接收缓冲区
						rev_length_command = 0;
						while(head_r != tail_r)
						{
							send_command();
						}
					}
				}
			}
		}
	}
    while(1)
	{
   	}
}

void start_leave()
{
	for (i=0;i<18;i++)
	{
       	rev_multi_video.sin_addr[i] = 0;
	}
	rev_multi_video.sin_addr[12] = rev_para_video[0][0];
    rev_multi_video.sin_addr[13] = rev_para_video[0][1];
    rev_multi_video.sin_addr[14] = rev_para_video[0][2];
   	rev_multi_video.sin_addr[15] = rev_para_video[0][3];
	rev_multi_video.sin_port = REV_VIDEO_PORT;
	if(leave(video_revhandle,&rev_multi_video,sizeof(struct sockaddr)) == 0)
	{
		puts("leave from rev_multi_video success! - 0");
	}
	else
	{
		puts("leave from rev_multi_video failure! - 0");
	}

	for (i=0;i<18;i++)
	{
       	rev_multi_video.sin_addr[i] = 0;
	}
	rev_multi_video.sin_addr[12] = rev_para_video[1][0];
    rev_multi_video.sin_addr[13] = rev_para_video[1][1];
    rev_multi_video.sin_addr[14] = rev_para_video[1][2];
   	rev_multi_video.sin_addr[15] = rev_para_video[1][3];
	rev_multi_video.sin_port = REV_VIDEO_PORT;
	if(leave(video_revhandle,&rev_multi_video,sizeof(struct sockaddr)) == 0)
	{
		puts("leave from rev_multi_video success! - 1");
	}
	else
	{
		puts("leave from rev_multi_video failure! - 1");
	}

	for (i=0;i<18;i++)
	{
       	rev_multi_audio.sin_addr[i] = 0;
	}
	rev_multi_audio.sin_addr[12] = rev_para_audio[0][0];
    rev_multi_audio.sin_addr[13] = rev_para_audio[0][1];
    rev_multi_audio.sin_addr[14] = rev_para_audio[0][2];
   	rev_multi_audio.sin_addr[15] = rev_para_audio[0][3];
   	rev_multi_audio.sin_port = REV_G711_PORT;
	if(leave(g711_revhandle,&rev_multi_audio,sizeof(struct sockaddr)) == 0)
	{
		puts("leave from rev_multi_audio success! - 0");
	}
	else
	{
		puts("leave from rev_multi_audio failure! - 0");
	}

	for (i=0;i<18;i++)

⌨️ 快捷键说明

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