C语言中怎么实现一个socket.io服务器端
C语言中怎么实现一个socket.io服务器端,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
十年的大荔网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都营销网站建设的优势是能够根据用户设备显示端的尺寸不同,自动调整大荔建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联公司从事“大荔网站设计”,“大荔网站推广”以来,每个客户项目都认真落实执行。
在运行socket.io_server之前,需要安装以下依赖:
sudo apt-get install uuid-dev sudo apt-get install libglib2.0-dev
如何运行
编写实现代码(eg:chatroom.c),需要包含头文件 endpoint_impl.h
把实现代码(eg:chatroom.c)放入examples目录
编写对应的html文件,放入static目录
编辑Makefile文件
终端下运行make命令
然后敲入 ./socket.io_server 接口运行
打开浏览器即可访问 (eg:http://localhost:8000/chatroom.html)
API说明
对外的API,可以在头文件 endpoint_impl.h 看到其定义,其继承了另外一个公用的头文件 endpoint.h, 其完整定义为:
#include#include #include typedef struct { char *message_type; char *message_id; char *endpoint; char *message_data; char *ori_data; } message_fields; typedef struct { char *endpoint; void (*on_init)(const char *endpoint); void (*on_connect)(const char *sessionid); void (*on_message)(const char *sessionid, const message_fields *msg_fields); void (*on_json_message)(const char *sessionid, const message_fields *msg_fields); void (*on_event)(const char *sessionid, const message_fields *msg_fields); void (*on_other)(const char *sessionid, const message_fields *msg_fields); void (*on_disconnect)(const char *sessionid, const message_fields *msg_fields); void (*on_destroy)(const char *endpoint); } endpoint_implement; extern void send_msg(char *sessionid, char *message); extern void broadcast_clients(char *except_sessionid, char *message); static void on_init(const char *endpoint); static void on_connect(const char *sessionid); static void on_message(const char *sessionid, const message_fields *msg_fields) { printf("on_message recevie ori msg is %s\n", msg_fields->ori_data); } static void on_json_message(const char *sessionid, const message_fields *msg_fields) { printf("on_json_message recevie ori msg is %s\n", msg_fields->ori_data); } static void on_other(const char *sessionid, const message_fields *msg_fields) { printf("on_other recevie ori msg is %s\n", msg_fields->ori_data); } static void on_event(const char *sessionid, const message_fields *msg_fields); static void on_disconnect(const char *sessionid, const message_fields *msg_fields); static void on_destroy(const char *endpoint); static endpoint_implement *init_default_endpoint_implement(char *endpoint_name) { endpoint_implement *impl_point = (endpoint_implement *)malloc(sizeof(endpoint_implement)); impl_point->endpoint = strdup(endpoint_name); impl_point->on_init = on_init; impl_point->on_connect = on_connect; impl_point->on_message = on_message; impl_point->on_json_message = on_json_message; impl_point->on_event = on_event; impl_point->on_other = on_other; impl_point->on_disconnect = on_disconnect; impl_point->on_destroy = on_destroy; return impl_point; }
完整定义.
在example目录中,你可以看到聊天室演示chatroom 和在线白板示范whiteboard .
#include#include #include #include #include "../endpoint_impl.h" typedef struct { char *event_name; char *event_args; } event_message; static char *event_message_reg = "{\"name\":\"(.*?)\",\"args\":\\[([^\\]]*?)\\]}"; static gchar *get_match_result(GMatchInfo *match_info, gint index) { gchar *match = g_match_info_fetch(match_info, index); gchar *result = g_strdup(match); g_free(match); return result; } static void *message_2_struct(gchar *post_string, event_message *event_msg) { GError *error = NULL; GRegex *regex; GMatchInfo *match_info; regex = g_regex_new(event_message_reg, 0, 0, &error ); g_regex_match( regex, post_string, 0, &match_info ); if (g_match_info_matches(match_info)) { event_msg->event_name = get_match_result(match_info, 1); event_msg->event_args = get_match_result(match_info, 2); } else { event_msg = NULL; } g_match_info_free( match_info ); g_regex_unref( regex ); return event_msg; } static GHashTable *hashtable; static void hashtable_init(void) { hashtable = g_hash_table_new(g_str_hash, g_str_equal); } static void hashtable_add(const char *key, void *value) { if (key) { g_hash_table_insert(hashtable, g_strdup(key), value); } } static gboolean hashtable_remove(const char *key) { if (key) return g_hash_table_remove(hashtable, key); return 0; } static void *hashtable_lookup(const char *key) { if (key == NULL) return NULL; return g_hash_table_lookup(hashtable, key); } /*static gint hashtable_size(void) { return g_hash_table_size(hashtable); }*/ static void hashtable_destroy(void) { g_hash_table_destroy(hashtable); } /** ** use the struct to warpper the demo implment **/ static char *endpoint_name; static void on_init(const char *endpoint) { hashtable_init(); printf("%s has been inited now\n", endpoint); endpoint_name = g_strdup(endpoint); } static void on_connect(const char *sessionid) { char messages[strlen(sessionid) + 50]; sprintf(messages, "5::%s:{\"name\":\"clientId\",\"args\":[{\"id\":\"%s\"}]}", endpoint_name, sessionid); send_msg(sessionid, messages); } static void send_it(char *session_id, char *messaage) { send_msg(session_id, messaage); } static void free_event_msg(event_message *event_msg) { free(event_msg->event_name); free(event_msg->event_args); } static void on_event(const char *sessionid, const message_fields *msg_fields) { event_message event_msg; if (!message_2_struct(msg_fields->message_data, &event_msg)) { fprintf(stderr, "%s Parse Message Error !\n", msg_fields->ori_data); return; } if (!strcmp(event_msg.event_name, "roomNotice")) { /*5::/whiteboard:{"name":"roomNotice","args":[{"room":"myRoom"}]}*/ char target_room_id[strlen(event_msg.event_args) - 10];// = event_msg.event_args + 9; strncpy(target_room_id, event_msg.event_args + 9, strlen(event_msg.event_args) - 11); GPtrArray *list = (GPtrArray *)hashtable_lookup(target_room_id); if (list == NULL) { list = g_ptr_array_new(); hashtable_add(target_room_id, list); } g_ptr_array_add(list, g_strdup(sessionid)); int room_count = list->len; char messages[strlen(sessionid) + 200]; sprintf(messages, "5::%s:{\"name\":\"roomCount\",\"args\":[{\"room\":\"%s\",\"num\":%d}]}", endpoint_name, target_room_id, room_count); hashtable_add(g_strdup(sessionid), g_strdup(target_room_id)); g_ptr_array_foreach(list, (GFunc)send_it, messages); free_event_msg(&event_msg); return; } char messages[strlen(msg_fields->ori_data) + 200]; sprintf(messages, "5::%s:{\"name\":\"%s\",\"args\":[%s]}", endpoint_name, event_msg.event_name, event_msg.event_args); free_event_msg(&event_msg); char *target_room_id = (char *)hashtable_lookup(sessionid); GPtrArray *list = (GPtrArray *)hashtable_lookup(target_room_id); if(list == NULL){ return; } int i; for (i = 0; i < list->len; i++) { char *session_id = g_ptr_array_index(list, i); if (strcmp(session_id, sessionid) == 0) continue; send_msg(session_id, messages); } } static void on_disconnect(const char *sessionid, const message_fields *msg_fields) { char *room_id = (char *)hashtable_lookup(sessionid); if (room_id == NULL) { fprintf(stderr, "the room_id is NULL\n"); return; } char notice_msg[strlen(endpoint_name) + strlen(room_id) + 70]; GPtrArray *list = (GPtrArray *)hashtable_lookup(room_id); sprintf(notice_msg, "5::%s:{\"name\":\"roomCount\",\"args\":[{\"room\":\"%s\",\"num\":%d}]}", endpoint_name, room_id, list->len - 1); int i, remove_index; for (i = 0; i < list->len; i++) { char *session_id = g_ptr_array_index(list, i); if (strcmp(session_id, sessionid) == 0) { remove_index = i; continue; } send_msg(session_id, notice_msg); } g_ptr_array_remove_index(list, remove_index); hashtable_remove(sessionid); free(room_id); } static void on_destroy(const char *endpoint) { printf("%s has been destroy now\n", endpoint); hashtable_destroy(); free(endpoint_name); } extern endpoint_implement *init_whiteboard_endpoint_implement(char *endpoint_name) { return init_default_endpoint_implement(endpoint_name); }
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。
新闻名称:C语言中怎么实现一个socket.io服务器端
文章来源:http://myzitong.com/article/ihccdi.html