广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言中怎么实现一个socket.io服务器端
  • 103
分享到

C语言中怎么实现一个socket.io服务器端

2023-06-17 08:06:07 103人浏览 安东尼
摘要

C语言中怎么实现一个Socket.io服务器端,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在运行socket.io_server之前,需要安装以下依赖:sud

C语言中怎么实现一个Socket.io服务器端,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

在运行socket.io_server之前,需要安装以下依赖:

sudo apt-get install uuid-dev  sudo apt-get install libglib2.0-dev

如何运行

  1. 编写实现代码(eg:chatroom.c),需要包含头文件 endpoint_impl.h

  2. 把实现代码(eg:chatroom.c)放入examples目录

  3. 编写对应的html文件,放入static目录

  4. 编辑Makefile文件

  5. 终端下运行make命令

  6. 然后敲入 ./socket.io_server 接口运行

  7. 打开浏览器即可访问 (eg:Http://localhost:8000/chatroom.html)

API说明

对外的api,可以在头文件 endpoint_impl.h 看到其定义,其继承了另外一个公用的头文件 endpoint.h, 其完整定义为:

#include <string.h>  #include <stdio.h>  #include <stdlib.h>   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 <stdio.h>  #include <stdlib.h>  #include <string.h>     #include <glib.h>     #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 void hashtable_destroy(void) {  g_hash_table_destroy(hashtable);  }      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")) {   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);  }

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网其他教程频道,感谢您对编程网的支持。

--结束END--

本文标题: C语言中怎么实现一个socket.io服务器端

本文链接: https://www.lsjlt.com/news/288033.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言中怎么实现一个socket.io服务器端
    C语言中怎么实现一个socket.io服务器端,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在运行socket.io_server之前,需要安装以下依赖:sud...
    99+
    2023-06-17
  • 怎么用c语言实现一个电话薄
    这篇文章主要讲解了“怎么用c语言实现一个电话薄”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用c语言实现一个电话薄”吧!先看一下这个小程序的效果这里我为了演示方便,把人数固定为3个;人数...
    99+
    2023-06-26
  • C语言中怎么实现一个通讯录系统
    C语言中怎么实现一个通讯录系统,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。全部代码如下所示:#include <iostream>#include&...
    99+
    2023-06-20
  • C语言中怎样实现一个排序算法
    本篇文章给大家分享的是有关C语言中怎样实现一个排序算法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。冒泡排序  冒泡排序(英语:BubbleS...
    99+
    2022-10-18
  • 使用C语言怎么实现一个猜拳小游戏
    本篇文章给大家分享的是有关使用C语言怎么实现一个猜拳小游戏,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体内容如下#include<stdio.h>#includ...
    99+
    2023-06-06
  • Go语言中怎么实现一个遗传算法
    这期内容当中小编将会给大家带来有关Go语言中怎么实现一个遗传算法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Go语言坚决拥护组合(composition),同时也很反对继承的做法,在网络上引起了强烈的讨...
    99+
    2023-06-17
  • 怎么在C语言中实现一个杨氏矩阵与杨辉三角
    这篇文章将为大家详细讲解有关怎么在C语言中实现一个杨氏矩阵与杨辉三角,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层...
    99+
    2023-06-15
  • C#中怎么构造一个POP3服务器
    C#中怎么构造一个POP3服务器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C#构造POP3服务器下面我们要用VS.NET 2003和C#开发一个“伪”POP3服务器——之所...
    99+
    2023-06-17
  • ASP.NETCore中怎么实现一个Kestrel服务器
    这篇文章给大家介绍ASP.NETCore中怎么实现一个Kestrel服务器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Kestrel Web服务器的概述Kestrel被认为是较新的ASP.NET应用程序的首选Web服...
    99+
    2023-06-19
  • 怎么实现一个Http服务器
    这期内容当中小编将会给大家带来有关怎么实现一个Http服务器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。说到http协议和http请求,很多人都知道,但是他们真的“知道”吗我面试过很多求职者,一说到ht...
    99+
    2023-06-04
  • Android中怎么搭建一个后端服务器
    这篇文章将为大家详细讲解有关Android中怎么搭建一个后端服务器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先我下载了一个myelipse应为我们开发android的eclipse不能...
    99+
    2023-05-31
    android 服务器
  • 怎么在C#中使用MJPEG实现一个客户端功能
    怎么在C#中使用MJPEG实现一个客户端功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。环境:服务端MJPEG服务器使用的是手机的DroidCam,很方便的一个MJPEG服务...
    99+
    2023-06-06
  • ASP.NET中怎么实现一个服务器控件
    ASP.NET中怎么实现一个服务器控件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。ASP.NET组件设计之ASP.NET服务器控件1、用户控件类似page,基本上不需要编程,...
    99+
    2023-06-18
  • Linux中怎么实现一个代理服务器
    本篇文章为大家展示了Linux中怎么实现一个代理服务器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。  1.安装Linux,不管是在图形,还是文体下都可以,选择最小安装,在安装的时候可以先配置一下外...
    99+
    2023-06-12
  • Nodejs中怎么实现一个TCP服务端与客户端聊天程序
    今天就跟大家聊聊有关Nodejs中怎么实现一个TCP服务端与客户端聊天程序,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。服务器端count:连接的客...
    99+
    2022-10-19
  • C#中怎么实现服务端与客户端通信
    C#中怎么实现服务端与客户端通信,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C#服务端与客户端通信实现实例:TcpClient client;&nb...
    99+
    2023-06-17
  • C#中怎么实现服务端与客户端连接
    这篇文章将为大家详细讲解有关C#中怎么实现服务端与客户端连接,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C#服务端与客户端连接实现实例:class Client {&n...
    99+
    2023-06-17
  • C#中怎么实现一个异步传输字符串客户端
    这篇文章给大家介绍C#中怎么实现一个异步传输字符串客户端,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C#异步传输字符串客户端的实现与服务端类似,我们首先对TcpClient进行一个简单的包装,使它的使用更加方便一些,...
    99+
    2023-06-17
  • C#中怎么实现一个随机数发生器
    C#中怎么实现一个随机数发生器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。***种方法不指定随机种子,系统自动选取当前时间作为随机种子:Random ro&nb...
    99+
    2023-06-18
  • C++中怎么实现一个多线程计数器
    C++中怎么实现一个多线程计数器,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。以计数器实现为例子,演示了多线程计数器的实现技术方法,代码如下://目的:&nbs...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作