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

📄 send_user_msg.c

📁 mgcp协议源代码和测试程序,还有一个编译器
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <arpa/inet.h>


#define 	OK		1
#define 	FAIL	0

#define		DESTN_PORT	6666
#define		LOCAL_PORT	8888

#define 	MGCP_USER_MSG				11
#define 	MGCP_MAX_LOCAL_NAME_LEN		128		// localname 最长为 128 字节
#define 	MGCP_MAX_ACTION_LEN			32
#define 	MGCP_MAX_CODE_LEN			32
#define 	MGCP_USER_MSG_MAX_LEN		4090

// 用户的动作
#define 	USER_HOOK_ON		1
#define 	USER_HOOK_OFF		2
#define 	USER_HOOK_FLUSH		4
#define 	USER_SEND_CODE		8

// 内部消息格式 ------> 协议栈的回调函数发给主线程的内部消息格式
typedef struct internal_msg_tag
{
	int imsg_type;
	unsigned char pch_user_msg[MGCP_USER_MSG_MAX_LEN];
}TInternal_Msg, *PTInternal_Msg;

// 发送挂机消息
int main(int argc, char * argv[])
{
	TInternal_Msg tinternal_msg;
	char pch_epid_buffer[MGCP_MAX_LOCAL_NAME_LEN+1] = {0};
	char pch_action_buffer[MGCP_MAX_ACTION_LEN+1] = {0};
	char pch_code_buffer[MGCP_MAX_CODE_LEN+1] = {0};
	struct sockaddr_in tsock_peer, tsock_me;
	int fd_send;
	socklen_t sock_len = sizeof(struct sockaddr_in);
	
	memset(&tsock_peer, 0, sock_len);
	memset(&tsock_me, 0, sock_len);
	
	// 创建日志套接口并绑定
	fd_send = socket(AF_INET, SOCK_DGRAM, 0);
	if (fd_send <= 0)
	{
		printf("\r\n\t socket fd_send fail!\r\n\r\n");
		return FAIL;
	}
	printf("\r\n\t socket fd_send ok\r\n");
	tsock_me.sin_family = AF_INET;
	tsock_me.sin_port = htons(LOCAL_PORT);
	tsock_me.sin_addr.s_addr = htonl(INADDR_ANY);
	if(bind(fd_send, (struct sockaddr *)&tsock_me, sock_len) < 0 )
	{
		printf("\r\n\t bind fd_send fail!\r\n");
		close(fd_send);
		return FAIL;
	}
	printf("\r\n\t bind fd_send ok\r\n\r\n");
	tsock_peer.sin_family = AF_INET;
	tsock_peer.sin_port = htons(DESTN_PORT);
	tsock_peer.sin_addr.s_addr = htonl(INADDR_ANY);
	
	while(1)
	{
		int ilen = 0;
		int idial_flag = 0;
		memset(&tinternal_msg, 0, sizeof(TInternal_Msg));
		scanf("%s %s", pch_epid_buffer, pch_action_buffer);
		printf("\r\n    deal %s %s\r\n", pch_epid_buffer, pch_action_buffer);
		ilen = strlen(pch_epid_buffer);
		tinternal_msg.imsg_type = MGCP_USER_MSG;
		
		if (strcmp(pch_action_buffer, "off") == 0)
		{
			tinternal_msg.pch_user_msg[0] = USER_HOOK_OFF;
		}
		else if (strcmp(pch_action_buffer, "dial") == 0)
		{
			scanf("%s", pch_code_buffer);
			tinternal_msg.pch_user_msg[0] = USER_SEND_CODE;
			idial_flag = 1;
		}
		else if (strcmp(pch_action_buffer, "on") == 0)
		{
			tinternal_msg.pch_user_msg[0] = USER_HOOK_ON;
		}
		else if (strcmp(pch_action_buffer, "flush") == 0)
		{
			tinternal_msg.pch_user_msg[0] = USER_HOOK_FLUSH;
		}
		
		if (idial_flag == 1)
		{
			int icode_len = strlen(pch_code_buffer);
			tinternal_msg.pch_user_msg[1] = ilen;
			tinternal_msg.pch_user_msg[2] = icode_len;
			memcpy(&(tinternal_msg.pch_user_msg[3]), pch_epid_buffer, ilen);
			memcpy(&(tinternal_msg.pch_user_msg[3+ilen]), pch_code_buffer, icode_len);
			ilen = icode_len + ilen + 3 + sizeof(tinternal_msg.imsg_type);
		}
		else
		{
			tinternal_msg.pch_user_msg[1] = ilen;
			memcpy(&(tinternal_msg.pch_user_msg[2]), pch_epid_buffer, ilen);
			ilen = ilen + 2 + sizeof(tinternal_msg.imsg_type);
		}
		
		if (sendto(fd_send, &tinternal_msg, ilen, 0,
		   (struct sockaddr *)&tsock_peer, sock_len) != ilen)
		{
			printf("\r\n    send tinternal_msg fail\r\n");
			continue;
		}
		printf("\r\n    send tinternal_msg OK\r\n");
	}
	
	return OK;
}





⌨️ 快捷键说明

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