当前位置: 编程技术>综合
本页文章导读:
▪产生十六进制的流水号
需求如下:
求一个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{#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 查看评论
最新技术文章: