免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1073 | 回复: 0
打印 上一主题 下一主题

linux下基于ipmsg协议的飞鸽传书(二) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-11 19:34 |只看该作者 |倒序浏览

文件发送接收:
#ifndef __SRFILE_H_
#define __SRFILE_H_
#include "ulits.h"
#include "filelist.h"
#include "usrlist.h"
#include "commands.h"
#include sys/stat.h>
extern int makeFileList(char *arg1[]);
int sendFileList(int sockfd,USERINFO *destusr,FILENODE *filelist);
#endif
#include "srfile.h"
//=========================================================================================
//函数名称:makeFileList(char *rfbuf)
//功能描述:生成发送文件链表
//函数参数:arg1[],发送文件名的指针数组
//返回值:
//=========================================================================================
int makeFileList(char *arg1[])
{
    //char *arg[10];
   
    char filename[50];
    char filesize[50];
    char mtime[50];
    char filetype[5];
    int i=2;
    struct stat filetypebuf;
   
    initFileList();
    while(arg1)
    {   
        memset(filename,0,sizeof(filename));
        memset(filesize,0,sizeof(filesize));
        memset(mtime,0,sizeof(mtime));
        memset(filetype,0,sizeof(filetype));
        printf("arg1[%i]=%s\n",i,arg1);
        if(lstat(arg1,&filetypebuf)0)
        {
            printf("file:'%s' is err!\n",arg1);   
            i++;
            continue;
        }
        
        if(S_ISREG(filetypebuf.st_mode))
        {
                sprintf(filetype,"%d",1);
        }
        else if(S_ISDIR(filetypebuf.st_mode))
        {
                sprintf(filetype,"%d",2);
        }
        else
        {
            //filetype=;
            continue;
        }
        
        strcpy(filename,arg1);
        sprintf(filesize,"%u",filetypebuf.st_size);
        sprintf(mtime,"%u",filetypebuf.st_mtime);
        printf("file[%d]=%s\n",i,filename);
        
        addFile(filename,filesize,mtime,filetype);
        i++;
    }   
    return i;
}
//============================================================================================
//函数名称:sendFileLIst(int sockfd,FILENODE *filelist)
//功能描述:发送文件链表
//函数参数:发送的sockfd对象,filelist发送的文件链表
//返 回 值:
//============================================================================================
int sendFileList(int sockfd,USERINFO *destusr,FILENODE *filelist)
{
        char sendbuf[600];
        FILENODE *tmpNode;
        int i=0;
        tmpNode=filelist;
        MSG sfMsg;
        
        while(tmpNode)
        {
            memset(sendbuf,0,sizeof(sendbuf));
            sprintf(sendbuf+1,"%d:%s:%x:%x:%x:\\a",tmpNode->fileno
                                                                                        ,tmpNode->filename
                                                                                        ,tmpNode->filesize
                                                                                        ,tmpNode->mtime
                                                                                        ,tmpNode->filetype);
//            len=len+strlen(tmpNode->fileno)+1;
//            strcpy(sendbuf+len,tmpNode->filename);
//            len=len+strlen(tmpNode->filename)+1;
//            strcpy(sendbuf+len,tmpNode->filesize);
//            len=len+strlen(tmpNode->mtime)+1;
//            strcpy(sendbuf+len,tmpNode->mtime);
//            len=len+strlen(tmpNode->filetype)+1;
//            strcpy(sendbuf+len,tmpNode->filetype);
            
            makeSendMsg(&sfMsg,sendbuf,destusr->ipaddr,IPMSG_SENDMSG|IPMSG_FILEATTACHOPT);//
            
            sendToMsg(sockfd,&sfMsg);
            tmpNode=tmpNode->next;
            i++;
            printf("i=%d in sendfilelist\n",i);
        
        }   
        return i;
}
//====================================================================================
//    The information contained herein is the exclusive property of
//    Sunnnorth Technology Co. And shall not be distributed, reproduced,
//    or disclosed in whole in part without prior written permission.
//    (C) COPYRIGHT 2003 SUNNORTH TECHNOLOGY CO.
//    ALL RIGHTS RESERVED
//    The entire notice above must be reproduced on all authorized copies.
//====================================================================================
//=============================================================
// 文件名称:demo.h
// 功能描述:链表使用示例程序
// 维护记录:2009-05-08 V1.1 by lijian
//=============================================================
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
typedef struct filenode
{
    struct filenode *next;
    unsigned int fileno;
    char *filename;
    char *filesize;
    char *mtime;
    char *filetype;
} FILENODE, *PFILENODE;
extern void initFileList(void);
int addFile(char *name, char *size,char *time,char *type);
int delFile(PFILENODE file);
int listFile(FILE *file);
PFILENODE findFileByName(char *name);
PFILENODE findFileByNum(unsigned int number);
#ifdef __cplusplus
};
#endif
//=============================================================
// 文件名称:本通用链表的快速使用方法及步骤(可用查找替换命令):
// 一、在头文件中根据自己需要增加/删除成员(除整数外,成员变量必须为指针类型)
// 二、把"filelist.h"替换成自己的头文件名
// 三、把"myFileList"替换成自己的文件列表名
// 四、在 根据自己的成员名称修改static void delFileEx()
// 五、在 根据自己的成员名称修改int addFile()
// 六、把其他成员变量修改一直
//包含文件:filelist.h lnklst.h
// 维护记录:2009-05-10 V1.2 by dengke mend some bugs!
//=============================================================
#include stdlib.h>
#include stdio.h>
#include unistd.h>
#include fcntl.h>
#include errno.h>
#include string.h>
#include "lnklst.h"
#include "filelist.h"
//========================================================================================
PFILENODE myFileList = NULL;//链表头在这里定义
static unsigned int count;
//========================================================================================
//函数名称:delFileEx(PFILENODE file)
//功能描述:释放节点所占用的堆内存空间
//函数参数:file要释放的节点指针
//返 回 值:
//===========================================================================================
static void delFileEx(PFILENODE file)//****此函数要根据成员数目来添加/删除成员
{
    if(file->filename)
        free(file->filename);
    if(file->filesize)
        free(file->filesize);
    if(file->mtime)
        free(file->mtime);
    if(file->filetype)
        free(file->filetype);
    free(file);
}
//==========================================================================================
//函数名称:destroyFileList(void)
//功能描述:链表初始化,所有内存空间清0
//函数参数:void
//返回值:
//=============================================================================================
static void destroyFileList(void)
{
    PFILENODE tmpNod = myFileList;
    while(tmpNod)
    {
        PFILENODE tmp = tmpNod->next;
        delFileEx(tmpNod); //清空节点所占的内存
        tmpNod = tmp;
    }
}
/***********************************以下为用户使用接口****************************************/
//=============================================================================================
//函数名称:initFileList(void)
//功能描述:调用destroyFileList来清空链表,完成初始化
//函数参数:
//返 回 值:
//============================================================================================
void initFileList(void)
{
    if(myFileList)
    {
        destroyFileList();
    }
    myFileList = NULL;
}
//=============================================================================================
//函数名称:addFile(char *name, char *host,char *ip)
//功能描述:在链表中插入一个节点
//函数参数:name、host、ip节点信息指针
//返回值:
//============================================================================================
int addFile(char *name, char *size,char *time,char *type) //使用通用链表时此函数必须修改
{
    PFILENODE newfile = (PFILENODE)malloc(sizeof(FILENODE));
    if(newfile == NULL)
        return -ENOMEM;
        
    newfile->filename = (char *)malloc(strlen(name) + 1);
    if(newfile->filename == NULL)
    {
        free(newfile);
        return -ENOMEM;
    }
   
    newfile->filesize = (char *)malloc(strlen(size) + 1);
    if(newfile->filesize == NULL)
    {
        free(newfile->filename);
        free(newfile);
        return -ENOMEM;
    }
   
    newfile->mtime = (char *)malloc(strlen(time) + 1);
    if(newfile->mtime == NULL)
    {
        free(newfile->mtime);
        free(newfile);
        return -ENOMEM;
    }
    newfile->filetype = (char *)malloc(strlen(type) + 1);
    if(newfile->mtime == NULL)
    {
        free(newfile->filetype);
        free(newfile);
        return -ENOMEM;
    }
   
    newfile->fileno=count;
    strcpy(newfile->filename, name);
    strcpy(newfile->filesize, size);
    strcpy(newfile->mtime, time);
    strcpy(newfile->filetype,type);
    count++;
    //pthread_mutext_lock();
    add_node((void**)&myFileList, newfile); //*****************这里要修改*****************
    //pthread_mutext_unlock();
    return 0;
}
//=============================================================================================
//函数名称:delFile(PFILENODE file)
//功能描述:调用函数del_node从链表中删除一个节点
//函数参数:file要从链表中删除节点
//返回值: 成功返回0,失败返回-1
//==============================================================================================
int delFile(PFILENODE file)
{
    if(file==NULL)
    {
     printf("node is not found!\n");   
     return -1;
    }
    del_node((void**)&myFileList, file); //这里要注意修改
    delFileEx(file);
    count--;
    return 0;
}
//===============================================================================================
//函数名称:findFileByName(char *name)
//功能描述:通过name查找节点
//函数参数:name要查找的节点关键字
//返 回 值:找到的节点的结构体指针,没找到为null
//===============================================================================================
PFILENODE findFileByName(char *name)
{
    PFILENODE ret = NULL;
    PFILENODE tmpNod = myFileList;
    while(tmpNod)
    {
        if(strcmp(tmpNod->filename, name) == 0)
        {
            ret = tmpNod;
            break;
        }
        tmpNod = tmpNod->next;
    }
    return ret;
}
//=================================================================================================
//函数名称:
//功能描述:通过num查找节点
//函数参数:
//返回值:
//=================================================================================================
PFILENODE findFileByNum(unsigned int number)
{
    //printf("find ok\n");
    PFILENODE ret = NULL;
    PFILENODE tmpNod = myFileList;
    while(tmpNod)
    {
        if(tmpNod->fileno == number)
        {
            ret = tmpNod;
            break;
        }
        tmpNod = tmpNod->next;
    }
    return ret;
}
//=================================================================================================
//函数名称:
//功能描述:打印输出链表
//函数参数:FIlE *file输出终端,显示器为,stdout
//返 回 值:输出链表个数
//=================================================================================================
int listFile(FILE *file)
{
    int counter = 1;
    char temp[10];
    PFILENODE fnode = myFileList;
    if(fnode == NULL)
        fprintf(file, "User List is empty!\n");
    else
    {
        fprintf(file, "%6s %20s %20s %20s %20s\n", "fileNo", "fileName", "filesize","mtime","filetype");
        while(fnode)
        {
            fprintf(file,"%6d %20s %20s %20s %20s\n", fnode->fileno, fnode->filename, fnode->filesize,fnode->mtime,fnode->filetype);
            fnode = fnode->next;
        }
        //fprintf(file, "%d users found!\n", count);
    }
    return counter;
}
/*
int main()
{
    addFile("filename0", "size0","mtime1","0");
    listFile(stdout);
    addFile("filename1", "size1","mtime1","1");
    addFile("filename2", "size2","mtime1","2");
    addFile("filename3", "size3","mtime1","3");
    addFile("filename4", "size4","mtime1","4");
    addFile("filename5", "size5","mtime1","5");
   
    listFile(stdout);
    //delFile(findFileByName("filename3"));
    delFile(findFileByNum(3));
    delFile(findFileByName("filename4"));
    listFile(stdout);
    printf("init list...\n");
    initFileList();
    listFile(stdout);
    return 0;
}
*/
字符串处理函数:

#ifndef __ULITS_H_
#define __ULITS_H_
#include stdlib.h>
#include stdio.h>
#include string.h>
#include assert.h>
extern void trim(char *dest, int flag);
extern int strSplit(char *split,const char *sour,char *result[]);
#endif
//////////////////////////////////////////////////
#include "ulits.h"
//===============================================================================
//函数名称:trim
//功能描述:字符串处理,去掉2端的空格,变成全小写(flag==1)
//函数参数:dest被处理的字符串指针变量,flag标志(flag==1)将字符串转换为小写
//返回值: 无
//================================================================================
void trim(char *dest, int flag)
{
  char *ptr;
  int len;
  assert(dest!=NULL);
  ptr = dest;
  
  while (isspace(*ptr))
    ptr++;
  len = strlen(ptr);
  if (ptr > dest)
    memmove(dest, ptr, len+1);
  
  ptr = dest+len-1;
  while (isspace(*ptr))
    ptr--;
  *(ptr+1) = '\0';
  ptr = dest;
  if (flag == 1)
    while (*ptr!='\0')
    {
      *ptr = tolower(*ptr);
      ptr++;
    }
}
//=================================================================================
//函数名称:strSplit
//功能描述:将一个被字符串split,按分割符sour,分割成段,每段首地址存放于指针数组result
//函数参数:split被分割字符串的指针变量,sour分割符指针变量,result分割结果存放的指针数组
//返回值: int 分割的段数;
//==================================================================================
int strSplit(char *split,const char *sour,char *result[])
{
    char *pos,*start;
    int i=0,counter=0;
   
    assert((split!=NULL)&&(sour!=NULL));
    pos=start=split;
    while(pos!=NULL)
    {
        pos=strstr(start,sour);//ls |
        if(pos==NULL)
        {
            result=start;
            counter++;
            break;
        }
        
        *pos='\0';
        if(*start)
        {
            result=start;
            i++;
            counter++;
        }
        start=pos+strlen(sour);
    }
   
    result[counter]=NULL;
    return counter;
}
通用链表:

//====================================================================================
//=============================================================
// 文件名称:lnklst.h
// 功能描述:通用链表管理程序
// 维护记录:2008-12-25     V1.0
// 2009-05-08 V1.1 by dengek fix some bug
//=============================================================
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
typedef enum {NOD_BEFORE = 0, NOD_AFTER = 1} NOD_POSITION;
void add_node_to(void **head, void *node, void *to, NOD_POSITION before_or_after);
void move_node(void **head, void *moved, void *to, NOD_POSITION before_or_after);
void add_node(void **head, void *node);
void del_node(void **head, void *node);
typedef int (*CMP_FUNC)(void *t1, void *t2);
void sort_list(void **head, CMP_FUNC nodcmp);
void add_node_sorted(void **head, void *node, CMP_FUNC nodcmp);
int get_node_count(void **head);
void *next_node(void *current);
void *get_node_byID(void *head, int ID);
#ifdef __cplusplus
};
#endif
//=============================================================
// 文件名称:lnklst.c
// 功能描述:通用链表管理程序
// 维护记录:2008-12-25     V1.0
// 2009-05-08 V1.1 by dengke fix some bug
//=============================================================
#include stdlib.h>
#include "lnklst.h"
#define ONE_WAY_LINKED_LIST
//#define TWO_WAY_LINKED_LIST
typedef struct basic_nod_t {
#ifdef TWO_WAY_LINKED_LIST
    struct basic_nod_t *prev;
#endif
    struct basic_nod_t *next;
} BASICNOD, *PBASICNOD;
static inline struct basic_nod_t *prev_node(PBASICNOD head, PBASICNOD nod)
{
#ifdef ONE_WAY_LINKED_LIST
    PBASICNOD n = head;
    if((nod == NULL) || ( nod == head))
        return NULL;
    while(n)
    {
        if(n->next == nod)
            return n;
        n = n->next;
    }
    return NULL;
#endif
#ifdef TWO_WAY_LINKED_LIST
    return nod->prev;
#endif
}
void *next_node(void *current)
{
    return (void *)((PBASICNOD)current)->next;
}
void *last_node(void *head)
{
    PBASICNOD p = (PBASICNOD)head;
    while(p && p->next)
    {
        p = p->next;
    }
    return p;
}
void add_node_to(void **head, void *node, void *to, NOD_POSITION before_or_after)
{
    struct basic_nod_t **h = (struct basic_nod_t**)head;
    struct basic_nod_t *n = (struct basic_nod_t*)node;
    struct basic_nod_t *tt = (struct basic_nod_t*)to;
    if(node == NULL)
        return;
    if(*h == NULL)
    {
        // the link list is empty
        *h = n;
#ifdef TWO_WAY_LINKED_LIST
        n->prev = NULL;
#endif
        n->next = NULL;
    }
    else if(before_or_after == NOD_BEFORE)
    {
        // move the 'moved' node to the place before 'to'
        // if 'to' is NULL, then move the 'moved' node to the head
#ifdef ONE_WAY_LINKED_LIST
        PBASICNOD prev_nod;
#endif
        if(tt == NULL)
            tt = *h;
        if(*h == tt)
            *h = n;
#ifdef TWO_WAY_LINKED_LIST
        n->prev = tt->prev;
#endif
        n->next = tt;
#ifdef TWO_WAY_LINKED_LIST
        tt->prev = n;
        if(n->prev != NULL)
        {
            n->prev->next = n;
        }
#endif
#ifdef ONE_WAY_LINKED_LIST
        prev_nod = prev_node(*h, tt);
        if(prev_nod)
        {
            prev_nod->next = n;
        }
#endif
    }
    else if(before_or_after == NOD_AFTER)
    {
        //move the 'moved' node to the place after 'to'
        if(tt == NULL)
            tt = last_node(*h);
        n->next = tt->next;
#ifdef TWO_WAY_LINKED_LIST
        n->prev = tt;
#endif
        tt->next = n;
#ifdef TWO_WAY_LINKED_LIST
        if(n->next != NULL)
            n->next->prev = n;
#endif
    }
}
void add_node(void **head, void *node)
{
    add_node_to(head, node, NULL, NOD_AFTER);
}
void del_node(void **head, void *node)
{
    PBASICNOD *h = (struct basic_nod_t**)head;
    PBASICNOD n = (struct basic_nod_t*)node;
#ifdef ONE_WAY_LINKED_LIST
    PBASICNOD tmp;
#endif
    if(h == NULL)
        return;
    if(*h == NULL)
        return;
    if(n == *h)
    {
        *h = n->next;
    }
#ifdef TWO_WAY_LINKED_LIST
    if(n->prev)
        n->prev->next = n->next;
    if(n->next)
        n->next->prev = n->prev;
#endif
#ifdef ONE_WAY_LINKED_LIST
    tmp = prev_node(*h, n);
    if(tmp)
        tmp->next = n->next;
#endif
}
void move_node(void **head, void *moved, void *to, NOD_POSITION before_or_after)
{
    PBASICNOD *h = (PBASICNOD *)head;
    PBASICNOD m = (PBASICNOD)moved;
    PBASICNOD tt = (PBASICNOD)to;
    if(    (h == NULL) || (*h == NULL) || (m == tt))
        return;
    del_node(head, moved);
    add_node_to(head, moved, to, before_or_after);
}
void sort_list(void **head, CMP_FUNC nodcmp)
{
    PBASICNOD *h = (PBASICNOD *)head;
    PBASICNOD nod1 = *h;
    PBASICNOD nod2 = nod1->next;
    int swaped = 1;
    if(nod2 == NULL)
        return;
    while(swaped)
    {
        swaped = 0;
        while(1)
        {
            if((*nodcmp)(nod1, nod2) > 0)
            {
                move_node(head, nod1, nod2, NOD_AFTER);
                nod2 = nod1->next;
                swaped = 1;
            }
            else
            {
                nod1 = nod2;
                nod2 = nod2->next;
            }
            if(nod2 == NULL)
            {
                nod1 = *h;
                nod2 = nod1->next;
                break;
            }
        }
    }
}
void add_node_sorted(void **head, void *node, CMP_FUNC nodcmp)
{
    int added = 0;
    PBASICNOD *h = (PBASICNOD *)head;
    PBASICNOD n = (PBASICNOD)node;
    PBASICNOD tmp = *h;
    if(*h == NULL)
    {
        add_node_to(head, node, NULL, NOD_AFTER);
        return;
    }
    if((*nodcmp)(n, *h)  0)
    {
        add_node_to(head, node, *h, NOD_BEFORE);
        return;
    }
//    if((*nodcmp)(n, last_node(*head,*h)) >= 0)
//    {
//        add_node(head, node);
//        return;
//    }
    while(tmp)
    {
        if((*nodcmp)(n, tmp)  0)
        {
            add_node_to(head, node, tmp, NOD_BEFORE);
            added = 1;
            break;
        }
        else
            tmp = tmp->next;
    }
    if(added == 0)
        add_node_to(head, node, NULL, NOD_AFTER);
}
int get_node_count(void **head)
{
    PBASICNOD *h = (PBASICNOD *)head;
    PBASICNOD tmp = *h;
    int count = 0;
    if(h == NULL)
        return 0;
    if(*h == NULL)
        return 0;
    while(tmp)
    {
        tmp = tmp->next;
        count++;
    }
    return count;
}
void *get_node_byID(void *head, int ID)
{
    PBASICNOD h = (PBASICNOD)head;
    PBASICNOD tmp;
    int count = 0;
    if(ID == 0)
        return head;
    for(tmp = h; tmp && (count  ID); tmp = tmp->next, count++);
    return tmp;
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/94835/showart_1924725.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP