使用glic事件循环实现socket监听外部发送的指令的demo
时间: 2024-03-16 08:46:01 浏览: 72
以下是一个简单的使用GLib事件循环监听socket的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <glib.h>
#define PORT 12345
static gboolean socket_callback(GIOChannel *channel, GIOCondition condition, gpointer user_data)
{
if (condition & G_IO_IN) {
gint sockfd = g_io_channel_unix_get_fd(channel);
struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
gchar buffer[1024];
memset(buffer, 0, sizeof(buffer));
if (recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &client_len) > 0) {
g_print("Received message: %s\n", buffer);
}
return TRUE;
}
return FALSE;
}
int main(int argc, char *argv[])
{
GMainLoop *loop = g_main_loop_new(NULL, FALSE);
gint sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1) {
fprintf(stderr, "Failed to create socket.\n");
exit(EXIT_FAILURE);
}
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT);
if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
fprintf(stderr, "Failed to bind socket.\n");
exit(EXIT_FAILURE);
}
GIOChannel *socket_channel = g_io_channel_unix_new(sockfd);
guint socket_id = g_io_add_watch(socket_channel, G_IO_IN, (GIOFunc)socket_callback, NULL);
g_io_channel_unref(socket_channel);
g_main_loop_run(loop);
g_source_remove(socket_id);
g_main_loop_unref(loop);
return 0;
}
```
这个示例代码中,我们创建了一个UDP socket,并把它注册到事件循环中。当socket接收到数据时,会调用`socket_callback()`函数处理这个事件。
`socket_callback()`函数中,我们调用`recvfrom()`函数从socket中接收数据,并打印出来。最后,函数返回TRUE表示事件已经处理完毕。
在`main()`函数中,我们创建了一个GMainLoop对象,并使用`g_main_loop_run()`函数启动事件循环。当事件循环结束时,我们使用`g_source_remove()`函数从事件循环中删除socket的事件源,并释放相关的资源。
注意:在实际使用中,应该根据自己的需要来选择不同的socket类型,并在回调函数中实现对外部指令的处理。同时,为了防止网络攻击,应该对接收到的数据进行校验和过滤。
阅读全文