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

📄 mgcp_test.c

📁 mgcp协议源代码和测试程序,还有一个编译器
💻 C
📖 第 1 页 / 共 3 页
字号:
										ptnotify_event = (MGCP_OBSERVED_EVENT *)calloc(1, sizeof(MGCP_OBSERVED_EVENT));					if (ptnotify_event == NULL)					{						printf("\r\n    %s : L%d", __FILE__, __LINE__);						break;					}					ptnotify_event->ePkgID = MGCP_PKG_LINE;					ptnotify_event->eEventID = L_OFF_HOOK_TRANSITION;										// 发送挂机通知					if (MgcpEndpointNotifyEvent((H_ENDPOINT)ptmgcp_endpoint_handle,												ptnotify_event, NULL) != OK)					{						printf("\r\n    %s : L%d", __FILE__, __LINE__);						printf("\r\n    MgcpEndpointNotifyEvent( ... ) : FAIL\r\n");						free(ptnotify_event);						break;					}										printf("\r\n    %s : L%d", __FILE__, __LINE__);					printf("\r\n    MgcpEndpointNotifyEvent( ... ) : OK\r\n");					free(ptnotify_event);					break;				}				case USER_HOOK_FLUSH:				{					H_MGCP_ENDPOINT ptmgcp_endpoint_handle = NULL;					MGCP_OBSERVED_EVENT *ptnotify_event = NULL;					char pch_local_name[MGCP_MAX_LOCAL_NAME_LEN+1];					int iname_len = 0;										printf("\r\n\r\n    %s : L%d", __FILE__, __LINE__);					printf("\r\n    MGCP_USER_MSG : USER_HOOK_ON");										iname_len = ptinternal_msg->u.pch_user_msg[1];					if (iname_len < 1)					{						printf("\r\n    %s : L%d\r\n", __FILE__, __LINE__);						break;					}					// 复制端点名称					memcpy(pch_local_name, &(ptinternal_msg->u.pch_user_msg[2]), iname_len);					pch_local_name[iname_len] = 0;					printf("\r\n    pch_local_name == %s\r\n", pch_local_name);										ptmgcp_endpoint_handle = FindEptHdByLocalName(pch_local_name);					if (ptmgcp_endpoint_handle == NULL)					{						printf("\r\n    %s : L%d\r\n", __FILE__, __LINE__);						break;					}										ptnotify_event = (MGCP_OBSERVED_EVENT *)calloc(1, sizeof(MGCP_OBSERVED_EVENT));					if (ptnotify_event == NULL)					{						printf("\r\n    %s : L%d", __FILE__, __LINE__);						break;					}					ptnotify_event->ePkgID = MGCP_PKG_LINE;					ptnotify_event->eEventID = L_FLASH_HOOK;										// 发送挂机通知					if (MgcpEndpointNotifyEvent((H_ENDPOINT)ptmgcp_endpoint_handle,												ptnotify_event, NULL) != OK)					{						printf("\r\n    %s : L%d", __FILE__, __LINE__);						printf("\r\n    MgcpEndpointNotifyEvent( ... ) : FAIL\r\n");						free(ptnotify_event);						break;					}										printf("\r\n    %s : L%d", __FILE__, __LINE__);					printf("\r\n    MgcpEndpointNotifyEvent( ... ) : OK\r\n");					free(ptnotify_event);					break;				}				case USER_SEND_CODE:				{					H_MGCP_ENDPOINT ptmgcp_endpoint_handle = NULL;					MGCP_OBSERVED_EVENT *ptnotify_event = NULL;					char pch_local_name[MGCP_MAX_LOCAL_NAME_LEN+1];					char pch_code[MGCP_MAX_CODE_LEN+1];					int iname_len = 0;					int icode_len = 0;					int i = 0;										printf("\r\n\r\n    %s : L%d", __FILE__, __LINE__);					printf("\r\n    MGCP_USER_MSG : USER_SEND_CODE");					iname_len = ptinternal_msg->u.pch_user_msg[1];					if (iname_len < 1)					{						printf("\r\n    %s : L%d\r\n", __FILE__, __LINE__);						break;					}					// 复制端点名称					memcpy(pch_local_name, &(ptinternal_msg->u.pch_user_msg[3]), iname_len);					pch_local_name[iname_len] = 0;					printf("\r\n    pch_local_name == %s", pch_local_name);										icode_len = ptinternal_msg->u.pch_user_msg[2];					if (icode_len < 1)					{						printf("\r\n    %s : L%d\r\n", __FILE__, __LINE__);						break;					}					// 复制要呼叫的号码					memcpy(pch_code, &(ptinternal_msg->u.pch_user_msg[3+iname_len]), icode_len);					pch_code[icode_len] = 0;					printf("\r\n    pch_code == %s\r\n", pch_code);										ptmgcp_endpoint_handle = FindEptHdByLocalName(pch_local_name);					if (ptmgcp_endpoint_handle == NULL)					{						printf("\r\n    %s : L%d\r\n", __FILE__, __LINE__);						break;					}					ptnotify_event = (MGCP_OBSERVED_EVENT *)calloc(1, sizeof(MGCP_OBSERVED_EVENT));					if (ptnotify_event == NULL)					{						printf("\r\n    %s : L%d", __FILE__, __LINE__);						break;					}					ptnotify_event->ePkgID = MGCP_PKG_DTMF;					for (i=0; i<icode_len; i++)					{						if (pch_code[i] >= '0' && pch_code[i] <= '9')						{							ptnotify_event->eEventID = D_DTMF_0 + pch_code[i] - '0';						}						else if (pch_code[i] == '#')						{							ptnotify_event->eEventID = D_DTMF_POUND;						}						else if (pch_code[i] == '*')						{							ptnotify_event->eEventID = D_DTMF_ASTERISK;						}						else if (pch_code[i] >= 'a' && pch_code[i] <= 'd')						{							ptnotify_event->eEventID = D_DTMF_A + pch_code[i] - 'a';						}						else if (pch_code[i] >= 'A' && pch_code[i] <= 'D')						{							ptnotify_event->eEventID = D_DTMF_A + pch_code[i] - 'A';						}						// 号码通知						if (MgcpEndpointNotifyEvent((H_ENDPOINT)ptmgcp_endpoint_handle,													ptnotify_event, NULL) != OK)						{							printf("\r\n    %s : L%d", __FILE__, __LINE__);							printf("\r\n    MgcpEndpointNotifyEvent( ... ) : FAIL\r\n");							free(ptnotify_event);							break;						}												printf("\r\n    %s : L%d", __FILE__, __LINE__);						printf("\r\n    MgcpEndpointNotifyEvent( ... ) : OK\r\n");						printf("\r\n    ptnotify_event->eEventID == %d", ptnotify_event->eEventID);						printf("\r\n    D_DTMF_0 == %d", D_DTMF_0);												usleep(1000*30);	// 让系统调度其他线程运行					}					free(ptnotify_event);					break;				}			}			break;		}	}	return OK;}// 在端口 6666 上收消息int main(int argc, char * argv[]){	int i = 0;	struct sockaddr_in sock_temp;	char recv_buffer[MAX_MGCP_DATAGRAM] = {0};	socklen_t sock_len = sizeof(struct sockaddr_in);	struct timeb ttimeb;	memset(&ttimeb, 0, sizeof(ttimeb));		if (ftime(&ttimeb) != 0)	{		printf("\r\n    ftime( ... ) fail \r\n");		return FAIL;	}	srand(ttimeb.millitm + 1);		memset(&gsock_main_recv, 0, sizeof(gsock_main_recv));	memset(&gsock_cbk_send, 0, sizeof(gsock_cbk_send));	// 创建日志套接口并绑定	gmain_recv_fd = socket(AF_INET, SOCK_DGRAM, 0);	if (gmain_recv_fd <= 0)	{		printf("\r\n\t socket gmain_recv_fd fail!\r\n\r\n");		return FAIL;	}	gsock_main_recv.sin_family = AF_INET;	gsock_main_recv.sin_port = htons(6666);	gsock_main_recv.sin_addr.s_addr = htonl(INADDR_ANY);	if(bind(gmain_recv_fd, (struct sockaddr*)&gsock_main_recv, sizeof(gsock_main_recv)) < 0 )	{		printf("\r\n\t bind gmain_recv_fd fail!\r\n");		close(gmain_recv_fd);		return FAIL;	}		ginternal_send_fd = socket(AF_INET, SOCK_DGRAM, 0);	if (ginternal_send_fd <= 0)	{		printf("\r\n\t socket ginternal_send_fd fail!\r\n\r\n");		close(gmain_recv_fd);		return FAIL;	}	gsock_cbk_send.sin_family = AF_INET;	gsock_cbk_send.sin_port = htons(7777);	gsock_cbk_send.sin_addr.s_addr = htonl(INADDR_ANY);	if(bind(ginternal_send_fd, (struct sockaddr*)&gsock_cbk_send, sizeof(gsock_cbk_send)) < 0 )	{		printf("\r\n\t bind ginternal_send_fd fail!\r\n");		close(gmain_recv_fd);		close(ginternal_send_fd);		return FAIL;	}		Debug_On(LOG_ABNF_MSG);	Debug_On(LOG_TASK_MSG);	Debug_On(LOG_ERROR);		// 创建协议栈	// 设置协议栈控制参数	// 注册端点并设置端点控制参数	// 启动协议栈		if (MgcpStackCreate(&gpStack, Cbk_MGCP_Stack, Cbk_Get_Connec_Params) == OK)	{		printf("\r\n\t MgcpStackCreate(...) success\r\n");	}	else	{		printf("\r\n\t MgcpStackCreate(...) fail\r\n");		return FAIL;	}		if (MgcpStackSetNetwork(gpStack, ntohl(inet_addr("192.168.7.40")), 2427) == OK)	{		printf("\r\n\t MgcpStackSetNetwork(...) success\r\n");	}	else	{		printf("\r\n\t MgcpStackSetNetwork(...) fail\r\n");		MgcpStackDestroy(gpStack);		return FAIL;	}		if (MgcpStackSetDomainName(gpStack, "MG100.ZXD1000.COM") == OK)	{		printf("\r\n\t MgcpStackSetDomainName(...) success\r\n");	}	else	{		printf("\r\n\t MgcpStackSetDomainName(...) fail\r\n");		MgcpStackDestroy(gpStack);		return FAIL;	}	// 设置命令的初始最大重发时长	if (MgcpStackSetMaxInitRTO(gpStack, 5000) == OK)	{		printf("\r\n\t MgcpStackSetMaxInitRTO(...) success\r\n");	}	else	{		printf("\r\n\t MgcpStackSetMaxInitRTO(...) fail\r\n");		MgcpStackDestroy(gpStack);		return FAIL;	}	// 设置命令的最大重发时长	if (MgcpStackSetMaxRTO(gpStack, 5000) == OK)	{		printf("\r\n\t MgcpStackSetMaxRTO(...) success\r\n");	}	else	{		printf("\r\n\t MgcpStackSetMaxRTO(...) fail\r\n");		MgcpStackDestroy(gpStack);		return FAIL;	}	if (MgcpStackSetRestartMaxDelay(gpStack, 50) == OK)	{		printf("\r\n\t MgcpStackSetRestartMaxDelay(...) success\r\n");	}	else	{		printf("\r\n\t MgcpStackSetRestartMaxDelay(...)  fail\r\n");		MgcpStackDestroy(gpStack);		return FAIL;	}		// 注册 ENDPOINT_TOTALL_CNT 个端点( 端点注册要在协议栈启动之前进行 )	for (i=0; i<ENDPOINT_TOTALL_CNT; i++)	{		char pch_temp[32];		memset(pch_temp, 0, 32);		sprintf(pch_temp, "aaln/%d", i+1);				if (MgcpStackRegisterEndpoint(gpStack, &gpEndpoint[i], pch_temp, Cbk_Sig_Check) != OK)		{			printf("\t register endpoint %s fail\r\n", pch_temp);			MgcpStackDestroy(gpStack);			return FAIL;		}		if (MgcpEndpointSetCallAgent(gpEndpoint[i], "192.168.6.38", 2727) != OK)		{			printf("\t MgcpEndpointSetCallAgent(...)  fail\r\n");			MgcpStackDestroy(gpStack);			return FAIL;		}		// 设置本端点支持的包类型		// G		if (MgcpEndpointSetDefaultPackage(gpEndpoint[i], MGCP_PKG_GENERIC_MEDIA) != OK)		{			printf("\t MgcpEndpointSetDefaultPackage(...) : MGCP_PKG_GENERIC_MEDIA fail\r\n");			MgcpStackDestroy(gpStack);			return FAIL;		}		// D		if (MgcpEndpointSetDefaultPackage(gpEndpoint[i], MGCP_PKG_DTMF) != OK)		{			printf("\t MgcpEndpointSetDefaultPackage(...) : MGCP_PKG_DTMF fail\r\n");			MgcpStackDestroy(gpStack);			return FAIL;		}		// L		if (MgcpEndpointSetDefaultPackage(gpEndpoint[i], MGCP_PKG_LINE) != OK)		{			printf("\t MgcpEndpointSetDefaultPackage(...) : MGCP_PKG_LINE fail\r\n");			MgcpStackDestroy(gpStack);			return FAIL;		}	}	printf("\r\n\t register endpoints success\r\n");			if (MgcpStackStart(gpStack) == OK)	{		printf("\r\n\t MgcpStackStart(...) success\r\n");	}	else	{		printf("\r\n\t MgcpStackStart(...) fail\r\n");		MgcpStackDestroy(gpStack);		return FAIL;	}	/*		i = 0;	while(i<ENDPOINT_TOTALL_CNT)	{		char pch_local_name[16] = {0};		H_MGCP_ENDPOINT ptmgcp_endpoint_handle = NULL;		sprintf(pch_local_name, "aaln/%d", i + 1);		ptmgcp_endpoint_handle = FindEptHdByLocalName(pch_local_name);		if (ptmgcp_endpoint_handle != NULL)		{			printf("\r\n    pch_local_name == %s", pch_local_name);			printf("\r\n    ptmgcp_endpoint_handle->pcEndpointName == %s",				   ptmgcp_endpoint_handle->pcEndpointName);		}		i++;	}*/	while (TRUE)	{		TInternal_Msg tinternal_msg;		int recv_len = 0;				memset(&tinternal_msg, 0, sizeof(tinternal_msg));		memset(&sock_temp, 0, sizeof(sock_temp));		memset(recv_buffer, 0, sizeof(MAX_MGCP_DATAGRAM));				// 收消息		if ((recv_len = recvfrom(gmain_recv_fd, recv_buffer, MAX_MGCP_DATAGRAM, 0,		    (struct sockaddr *)&sock_temp, (socklen_t *)&sock_len)) <= 0)		{			printf("\r\n    recieve internal message fail\r\n");			continue;		}				// 处理消息		if (recv_len >= 4)		{			memcpy(&tinternal_msg, recv_buffer, sizeof(tinternal_msg));			Deal_Msg(&tinternal_msg);		}	}	printf("\r\n\t shall destroy the stack\r\n");	MgcpStackDestroy(gpStack);	printf("\r\n\t Destroying MGCP stack success\r\n");	printf("\r\n\t The End\r\n\r\n");	return OK;}

⌨️ 快捷键说明

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