📄 send_user_msg.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 + -