当前位置:  编程技术>综合
本页文章导读:
    ▪产生十六进制的流水号       需求如下: 求一个Function, 用 0~9,A~F  这几个数字及字母,产生流水号,,产生的数据如下 格式: 00000,00001,00002,00003,00004,00005,00006,00007,00008,00009,0000A,0000B,0000C,0000.........
    ▪基于Linux的消息队列及多线程编程实现的聊天室(一)      本程序主要是针对Linux IPC通信初学者对Linux下消息队列通信机制,多线程编程,字符串处理,链表操作等基本概念的练习。原理:  消息队列是System V支持一种IPC机制,通过类似链表的操作.........
    ▪获得本机IP地址列表      /* * main.c * ---------------------------------------------- * 2013-01-09 chrisniu1984@gmail.com * * [BUILD] * gcc -o main main.c -Wall * */ #include <stdio.h> #include <netdb.h> #include <ifaddrs.h> // 系统定义的结.........

[1]产生十六进制的流水号
    来源: 互联网  发布时间: 2013-11-10

需求如下:

求一个Function, 用 0~9,A~F  这几个数字及字母,产生流水号,,产生的数据如下 格式:
00000,00001,00002,00003,00004,00005,00006,00007,00008,00009,0000A,0000B,0000C,0000D,0000E,0000F,00010....

解决如下:

1、新建产生十进制的序列号SEQ_HEX
CREATE SEQUENCE SEQ_HEX
MINVALUE 0
MAXVALUE 10000000
START WITH 0
INCREMENT BY 1
CACHE 20
CYCLE
ORDER;

2、写一个函数,函数的作用是返回十六进制的序列号

CREATE OR REPLACE FUNCTION getHexSequence
RETURN VARCHAR2
AS
    N_SHANG NUMBER(10);
    N_YUSHU NUMBER(10);
    HEXRES   VARCHAR2(10);
BEGIN
    N_SHANG :=seq_hex.NEXTVAL;
    IF N_SHANG = 0 THEN
          RETURN '00000';
    END IF;
    WHILE N_SHANG>0  LOOP
        N_YUSHU:=N_SHANG MOD 16;
        SELECT CONCAT(DECODE(N_YUSHU,'10','A','11','B','12','C','13','D','14','E','15','F',N_YUSHU),HEXRES) INTO HEXRES FROM DUAL;
        N_SHANG := TRUNC(N_SHANG/16);
    END LOOP;
    RETURN LPAD(HEXRES,5,0);
END;

3、在程序中调用,产生十六进制的序列号

SQL> SELECT  getHexSequence FROM dual;

GETHEXSEQUENCE
----------------------------------------
000AD

上述解决方法不一定是最优的,希望抛砖引玉,看有没有更好的解决方案。


作者:ziwen00 发表于2013-1-9 11:21:09 原文链接
阅读:27 评论:0 查看评论

    
[2]基于Linux的消息队列及多线程编程实现的聊天室(一)
    来源: 互联网  发布时间: 2013-11-10

本程序主要是针对Linux IPC通信初学者对Linux下消息队列通信机制,多线程编程,字符串处理,链表操作等基本概念的练习。

原理:

  消息队列是System V支持一种IPC机制,通过类似链表的操作向一个FIFO里通过msgsnd发送用户自定义数据,进程可以通过msgrcv来接收指定类似mtype的数据,从而实现进程间通信。

主要实现了以下功能:

  • 通过多个终端登录,不同终端上登录用户实现私聊
  • 群聊
  • 查看在线用户
  • 简单注册(没有实现用户保存,类似于公共聊天室)
  • 下面是几种操作的处理流程分析。详细代码分析见下篇博文:

              http://blog.csdn.net/mr_raptor/article/details/8484822

    代码下载:

              http://download.csdn.net/detail/mr_raptor/4976808


     >> 服务器通过特定的类型mtype:1000,从消息队列上接收数据。

     >> 当前登录用户将随机产生(random())的一个ID号作为申请,如下协议向服务器1000发送申请消息。

    @msg.h

    // CMD:FROM:TIME:DATA 
    #define     DATA_LEN    4
    #define     OFT_CMD     0
    #define     OFT_FRM     1
    #define     OFT_TIM     2
    #define     OFT_DAT     3
    #define     DATA_TOK    ":"

    CMD:FROM:TIME:DATA

      CMD:表示执行的操作

      FROM:表示来自哪个终端

      TIME:申请时间

      DATA:用户发送数据

      >> 服务器在接收到用户申请请求后,加入到服务器维护的链表里,然后从可用ID里取出可用ID号分配给新申请用户,以后通信都通过新的ID号作用消息队列的mtype。


    @msg.h

    #define     START_ID    1
      >> 登录用户接收到服务器分配的新ID后,开启接收消息线程等待接收来自消息队列里,并且发送能自己的消息。

    @msg_client.c

     login();
     while(pthread_create(&thread, NULL, receiver_looper, NULL) < 0);
     break;

    void * receiver_looper(void * p){
        if(userid == 0)
            return NULL;
        char * data[DATA_LEN];
        char * str, *subtoken;
        int i;
        while(1){
            if(msgrcv(msgid, &msg_rcv, sizeof(msg_rcv), userid, 0) < 0){
                perror("msgrcv");
                continue;
            }else{


      >> 当用户在消息队列上收到消息后,按照前面说的通信协议解析(strtok())接收到的数据,格式化后依据不同的CMD操作用于分支处理。
    #ifdef _DEBUG
                printf("%s received: %s\n", __func__, msg_rcv.buffer);
    #endif
                memset(data, NULL, sizeof(data));
                for(str = msg_rcv.buffer, i = 0; ; str = NULL, i++){
                    subtoken = strtok(str, DATA_TOK);
                    if(subtoken == NULL)
                        break;
                    data[i] = subtoken;
    #ifdef _DEBUG
                    printf("> data[%d] = %s\n", i, subtoken);
    #endif
                }
                // process received data
                // data format error
                if(i != DATA_LEN)
                    continue;
    
                switch(data[OFT_CMD][0]){
                case CMD_LIST:
                    if(strcmp(data[OFT_FRM], TYPE_SERVER_STR)){
                        continue;
                    }
                    format_user_list(data[OFT_DAT]);
                    break;
                case CMD_LOGOUT:
                    if(strcmp(data[OFT_FRM], TYPE_SERVER_STR)){
                        continue;
                    }
                    printf("> %s ", data[OFT_DAT]);
                    printf("%s\n", time2str(atol(data[OFT_TIM]), data[OFT_DAT]));
                    exit(0);
                case CMD_CHAT:      // print chat content
                    printf("\n%s \n\t\t", data[OFT_DAT]);
                    printf("%s\n", time2str(atol(data[OFT_TIM]), data[OFT_DAT]));
                    printf("\n%s# ", name);
                    fflush(stdout);
                    break;                                                        
                case CMD_SEND_FILE:
                    break;
                }
            }

      >> 群聊消息发送给服务器,服务器收到后,遍历在线链表,向每个在线用户发送消息。

    @msg_svr.c

    下面是分支处理代码片段:

     case CMD_TOALL:
         // send to all online client
         p = (&msg_list_head)->next;
         while(p){
             u= (struct user*)p;
             send_msg(u->id, CMD_CHAT, data[OFT_FRM], data[OFT_DAT]);
             p = p->next;
         }
         break;

    注:本程序只能运行在一个主机上不同终端之间,不能实现跨主机通信。


    运行情况如下:

    服务器运行情况:

    主要打印客户端的用户操作,消息转发等信息。


    客户端登录:初始帮助信息



    用户登录及列出在线用户:


    另外一个终端登录luccy用户,列出在线用户:


    私聊:


    另外一个终端收到信息:


    群聊,两个终端都收到信息:




    退出:



    另外还有文件传输功能,留给同学们自己去实现吧。






    作者:mr_raptor 发表于2013-1-9 11:18:43 原文链接
    阅读:69 评论:0 查看评论

        
    [3]获得本机IP地址列表
        来源: 互联网  发布时间: 2013-11-10
    /*
     * main.c
     * ----------------------------------------------
     * 2013-01-09 chrisniu1984@gmail.com
     *
     * [BUILD]
     * gcc -o main main.c -Wall
     *
     */
    
    #include <stdio.h>
    
    #include <netdb.h>
    #include <ifaddrs.h>
    
    // 系统定义的结构,贴在这里方便大家查阅,也可man getifaddrs查看。
    // struct ifaddrs {
    //     struct ifaddrs  *ifa_next;    /* Next item in list */
    //     char            *ifa_name;    /* Name of interface */
    //     unsigned int     ifa_flags;   /* Flags from SIOCGIFFLAGS */
    //     struct sockaddr *ifa_addr;    /* Address of interface */
    //     struct sockaddr *ifa_netmask; /* Netmask of interface */
    //     union {
    //         struct sockaddr *ifu_broadaddr;
    //                          /* Broadcast address of interface */
    //         struct sockaddr *ifu_dstaddr;
    //                          /* Point-to-point destination address */
    //     } ifa_ifu;
    // #define              ifa_broadaddr ifa_ifu.ifu_broadaddr
    // #define              ifa_dstaddr   ifa_ifu.ifu_dstaddr
    //     void            *ifa_data;    /* Address-specific data */
    // };
    
    int main(int argc, char **argv)
    {
        struct ifaddrs *ifa;
        if (getifaddrs(&ifa) != 0) {
            return -1;
        }
        
        for (; ifa!=NULL; ifa=ifa->ifa_next) {
            struct sockaddr_in *sin = (struct sockaddr_in*)ifa->ifa_addr;
            if (sin->sin_family != AF_INET) {
                continue;
            }
    
            unsigned char *b = (unsigned char *)(&sin->sin_addr.s_addr);
            printf("%s\t%u.%u.%u.%u\n", ifa->ifa_name, b[0], b[1], b[2], b[3]);
        }
    
        return 0;
    }
    

    作者:ChrisNiu1984 发表于2013-1-9 11:17:55 原文链接
    阅读:29 评论:0 查看评论

        
    最新技术文章:
    ▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
    ▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
    ▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
    ▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
    ▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
    ▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
    ▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
    ▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
    ▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
    ▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
    ▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
    ▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
    ▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
    ▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
    ▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
    ▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
    ▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
    ▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
    ▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
    ▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
    ▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
    ▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
    php iis7站长之家
    ▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
    ▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
    ▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
    ▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
    ▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
    ▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
    ▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3