免费注册 查看新帖 |

Chinaunix

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

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

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

运行机制介绍:
使用TCP/UDP端口(默认端口为2425),消息的收发使用UDP协议,文件(文件夹)的收发使用TCP协议。(文件传输部分待续....)
主函数:创建线程实现,聊天、用户上线、下线、文件传送
//===============================================================================================
//工程名称:飞鸽传书
//功能描述: 用ipmsg协议实现网络聊天,用户上、下线、文件传输
//包含文件: command.c usrlist.c filelist.c srfile.c ulits.c
//作者: by dengke.
//=============================================================================================
#include pthread.h>
#include "commands.h"
#include "usrlist.h"
#include "filelist.h"
#include "srfile.h"
extern const char allHost[];
extern int msgSock;
extern int tcpSock;
extern PFILENODE myFileList;
struct passwd *pwd;
struct utsname sysName;
char usrcmd[1024];
pthread_mutex_t ipmsg_mutex;
//
int initServ(struct sockaddr_in *servaddr)
{
    bzero(servaddr,sizeof(*servaddr));
    msgSock=socket(AF_INET,SOCK_DGRAM,0);//AF_INET-使用ip协议族,sock_dgram使用面向无连接,0具体使用的协议由系统指定
    tcpSock=socket(AF_INET,SOCK_STREAM,0);//
   
    servaddr->sin_family=AF_INET;
    servaddr->sin_port=htons(IPMSG_DEFAULT_PORT);//端口使用ipmsg默认的69号端口;
    servaddr->sin_addr.s_addr=htonl(INADDR_ANY);
   
    int broadcast_on=1;//打开广播选项
    if (setsockopt(msgSock, SOL_SOCKET, SO_BROADCAST, &broadcast_on, sizeof(broadcast_on))0)
  {
    printf("initSvr: Socket options brodcast set error.\n");
    exit(1);
  }
   
    if(bind(msgSock,(struct sockaddr*)servaddr,sizeof(*servaddr))0)
    {
        perror("initServ: bind msgsock err!\n");
        exit(1);
    }
    //*
    if(bind(tcpSock,(struct sockaddr*)servaddr,sizeof(*servaddr))0)
    {
        perror("initServ: bind tcpSock err!\n");
        exit(1);
    }
    if(listen(tcpSock,10)0)
    {
        perror("initServ: listen tcpSock err!\n");
        exit(1);   
    }
    //*/
    printf("init msgServ finshed!\n");
    return 0;
}
//=========================================================================
//函数名称:
//功能描述:上线提示
//函数参数:
//返回值:
//==========================================================================
void loginBordCast()
{
     MSG loginMsg;
     char brodcastMsg[]="wolf online!";
     
     makeSendMsg(&loginMsg,brodcastMsg,allHost,IPMSG_BR_ENTRY);
        sendToMsg(msgSock,&loginMsg);
        
        return ;
}
//===============================================================================================
//函数名称:printOlineUsr()
//功能描述:打印在线用户
//
//================================================================================================
void printOnlineUsr()
{
        printf("---------------------onlie usr info-------------------\n ");
        listUsr(stdout);
        printf("---------------------onlie usr info-------------------\n ");
}
//===================================================================================================
//函数名称:recverPthread(void *sockfd)
//功能描述:接收信息处理线程,生成在线用户列表,显示消息
//函数参数:
//返回值:
//===================================================================================================
void *recverPthread(void *sockfd)
{
    struct sockaddr_in fromServer;
    char recvbuf[MAX_BUF];
    char fromIp[20];
    size_t fromServLen;   
    size_t recvMsgLen;
    int recvSock=*(int*)sockfd; //****
    MSG recvMsg;
    MSG retMsg;
   
    fromServLen=sizeof(fromServer);
   
    while(1)
    {                                                //接收客服端信息
            if(recvMsgLen=recvfrom(recvSock,recvbuf,sizeof(recvbuf),0,(struct sockaddr *)&fromServer,&fromServLen));
            {
                inet_ntop(AF_INET,&fromServer.sin_addr.s_addr,fromIp,16);
                if(strcmp(fromIp,"192.168.220.211"))//自己ip不收
                {                    
                        //pthread_mutex_lock(&ipmsg_mutex);//----------pthread_mutex_lock---------
                        
                        msgParser(&recvMsg,recvbuf);//解释信息,将信息解析成结构体
                        
                           
                        if(((recvMsg.commandNo&IPMSG_BR_ENTRY)==1)||((recvMsg.commandNo&IPMSG_ANSENTRY)==3))//报文是用户上线提示或通报在线
                        {        
                                if(!findUsrByName(recvMsg.senderName))//如果在线用户链表没有该用户则添加
                                {
                                        addUsr(recvMsg.senderName,recvMsg.senderHost,fromIp);//插入一个在线用户
                                        //printf("%s is online !\n",recvMsg.senderName);//上线提示
                                }
                        }
                        else if((recvMsg.commandNo&IPMSG_BR_EXIT)==2)//用户退出
                        {
                                if(findUsrByName(recvMsg.senderName)!=NULL)
                                {
                                    delUsr(findUsrByName(recvMsg.senderName));//
                                }
                        }
                        else if(((recvMsg.commandNo&IPMSG_SENDMSG)==4)||(recvMsg.commandNo&0xff)==32)
                        { //显示发送消息
                                //printf("%s ",recvMsg.senderName);
                                printf("%s(",recvMsg.senderHost);
                                printf("%s):",fromIp);
                                printf("%s\n",recvMsg.additional);
                                
                                makeSendMsg(&retMsg,"收到了",fromIp,IPMSG_RECVMSG);//收到后发回应
                                sendToMsg(recvSock,&retMsg);
                                
                        }
                        else
                        {
                        }
//                                printf("%s ",recvMsg.senderName);
//                                printf("%s ",recvMsg.senderHost);
//                                printf("%s ",fromIp);
//                                printf("Sendmsg=%d ",(recvMsg.commandNo&IPMSG_SENDMSG));
//                                printf("用户上线=%d ",(recvMsg.commandNo&IPMSG_BR_ENTRY));
//                                printf("tcp请求=%d ",(recvMsg.commandNo&IPMSG_GETFILEDATA));
//                                printf("传送文件选项=%d ",(recvMsg.commandNo&IPMSG_FILEATTACHOPT));
//                                printf("附件=%s\n",recvMsg.additional);
                }
                //pthread_mutex_unlock(&ipmsg_mutex); //--------pthread_mutex_unlock----------
            }
    }
   
}
//=================================================================================================
//函数名称:chat();
//功能描述:实现与客服端聊天
//函数参数:
//返回值:
//================================================================================================
void chat(int chatSock)
{
        char chatbuf[1024];
        char tempbuf[10];
        char destIp[20];
        unsigned int usrNo;
        USERINFO *chatUsr;
        MSG talkMsg;
        while(1)
        {
                pthread_mutex_lock(&ipmsg_mutex);//---------------pthread_mutex_lock-----
                printOnlineUsr();
                pthread_mutex_unlock(&ipmsg_mutex);//-------------pthread_mutex_unlock----
                printf(" 'q'---to go back!\n");
                printf("input a usrNo form usrlist for chat:");
                fgets(tempbuf,sizeof(tempbuf),stdin);
                //pthread_mutex_lock();
                if(!strcmp(tempbuf,"q\n"))
                {
                    return;
                }
                if(!isdigit(tempbuf[0]))
                {
                         printf("err!please input a usrlist num:\n");   
                         continue;
                }
                usrNo=atoi(tempbuf);
                if(!isdigit(usrNo))
                {
                        pthread_mutex_lock(&ipmsg_mutex);//--------pthread_mutex_lock-----
                        chatUsr=findUsrByNum(usrNo);
                        pthread_mutex_unlock(&ipmsg_mutex);//---------pthread_mutex_unlock
                        if(chatUsr) //找到聊天的对象
                        {
                                strcpy(destIp,chatUsr->ipaddr);   
                                while(1)
                             { //与选定的usr聊天
                                                                 
                                     printf("destIp(%s):",destIp);
                                        memset(chatbuf,0,sizeof(chatbuf));
                                        //pthread_mutex_unlock();
                                        fgets(chatbuf,sizeof(chatbuf),stdin);
                                     //pthread_mutex_lock();
                                        if(!strcmp(chatbuf,"q\n"))//退出聊天,返回上一级目录
                                        {
                                                    break;
                                        }
                                        pthread_mutex_lock(&ipmsg_mutex);//---------pthread_mutex_lock-------
                                        makeSendMsg(&talkMsg,chatbuf,destIp,IPMSG_SENDMSG);
                                        sendToMsg(chatSock,&talkMsg);
                                        pthread_mutex_unlock(&ipmsg_mutex);//---------pthread_mutex_unlock---
                                    }
                            }
                            else
                            {
                                    printf("you select usr is not online\n");
                                    continue;
                            }
                }
                else
                {
                            printf("your input usrNo is not digit!\n");
                            continue;   
                }
                //pthread_mutex_unlock();
        }   
}
//=================================================================================================
//函数名称:
//功能描述:打印帮助信息
//函数参数:
//返回值:
//==================================================================================================
void printFunMenu()
{
            printf("****************function menu******************\n");
            printf(" 'ls'---list all online usr \n");
            printf(" 'chat'---begin to chat \n");
            printf(" 'sf'---sendfile example: sf file1 file2 \n");
            printf(" 'rf'---recvsfile example: rf file1 file2 \n");
            printf(" 'help'---help info \n");
            printf(" 'exit'---quit system \n");
            printf("****************function menu******************\n");
            
}
//=================================================================================================
//函数名称:usrTalkPthread(void *sockfd)
//功能描述:线程、接收用户输入
//函数参数:
//返 回 值:
//===================================================================================================
void *getCmdPthread(void *sockfd)
{
        int talkSock=*(int *)sockfd;
        char rfcmdbuf[100];
        char *arg[100];
        char usrno[20];
        
        USERINFO *selectuser;
        
        while(1)
        {        printf("\r ");
                printf("\r select your command:");
                fgets(usrcmd,sizeof(usrcmd),stdin);
                //pthread_mutex_lock();
                if(!strcmp(usrcmd,"ls\n"))
                {        pthread_mutex_lock(&ipmsg_mutex);//-----pthread_mutex_lock-----
                        printOnlineUsr();
                        pthread_mutex_unlock(&ipmsg_mutex); //----pthread_mutex_unlock
                }
                else if(!strcmp(usrcmd,"chat\n"))
                {
                        chat(talkSock);//
                }
                else if(!strcmp(usrcmd,"help\n"))
                {
                        printFunMenu();
                }
                else if(!strcmp(usrcmd,"exit\n"))
                {
                        perror("in exit\n");
                        exit(1);
                }
                else if(!strcmp(usrcmd,"sf\n"))
                {
                     //----------------------------pthread_mutex_lock-------------
                        pthread_mutex_lock(&ipmsg_mutex);
                        printOnlineUsr();
                        pthread_mutex_unlock(&ipmsg_mutex); //--------prhread_mutex_unlock
                        
                        printf("input command:sf usrNo filename\n");
                        printf("example:sf 1 file1 file2 ...\n");
                        fgets(rfcmdbuf,sizeof(rfcmdbuf),stdin);
                                                //---------------------------------pthread_mutex_lock---------
                        pthread_mutex_lock(&ipmsg_mutex);
                        rfcmdbuf[strlen(rfcmdbuf)-1]='\0';
                        int count=0;
                        count=strSplit(rfcmdbuf," ",arg);   
                    
                        if(!isdigit(atoi(arg[1]))&&(count2))
                        {
                                printf("command is bad commad!\n");
                                continue;
                        }
                        //printf("arg[1]=%s arg[2]=%s\n",arg[1],arg[2]);
                        //printf("before makefilelist\n");
//                        int i=2;
//                        while(arg)
//                        {
//                            printf("arg[%d]=%s\n",i,arg);
//                            i++;
//                        }
                        makeFileList(arg);//生成文件列表
                        //printf("after makefilelist\n");
                        listFile(stdout);
                        strcpy(usrno,arg[1]);
                        selectuser=findUsrByNum(atoi(usrno));//获得选定的用户信息
                        sendFileList(talkSock,selectuser,myFileList);
                            //---------------------------------pthread_mutex_unlock---------
                        pthread_mutex_unlock(&ipmsg_mutex);
                }
                else if(!strcmp(usrcmd,"rf\n"))
                {
                           
                }
                else
                {
                    printf("command '%s' is not found!",usrcmd);   
                    
                }
                //pthread_mutex_unlock();
        }
}
//void *recvFilePthread(void *sockfd)
//{
//        int connfd;
//        struct sockaddr_in clientAddr;
//        size_t clientLen=sizeof(clientAddr);
//        char databuf[1024];
//        size_t recvLen;
//        connfd=accept(tcpSock,(struct *)&clientAddr,(socklen_t *)&clientLen);
//        while(1)
//        {
//                if((recvLen=read(tcpSock,databuf,sizeof(databuf)))>0)
//                {
//                        
//                }
//        }
//}
//==================================================================================================
//函数名称:
//功能描述:接收文件传输(完成中......)
//函数参数:
//返回值:
//==================================================================================================
void *recvFilePthread(void *sockfd)
{
        char recvbuf[1024];
        int connfd;
        int clientSock=*(int *)sockfd;
        struct sockaddr_in clientServer;
        size_t client_len=sizeof(clientServer);
        size_t recvLen;
        
        connfd=accept(clientSock,(struct sockaddr *)&clientServer,&client_len);
        while(1)
        {
                if((recvLen=read(connfd,recvbuf,sizeof(recvbuf)))>0)
                {
                    printf("recvbuf=%s\n",recvbuf);   
                }   
                else
                {
                    break;   
                }
        }
        close(clientSock);
}
//=============================================================================================
//函数名称:
//功能描述:创建线程实现,聊天、用户上线、下线、及文件传送
//函数参数:
//返回值:
//==============================================================================================
int main(int argc,char *argv[])
{
   
    struct sockaddr_in msgServer;
    pthread_t recvMsg,usrCmd,recvFile,sendFile;
   
    pthread_mutex_init(&ipmsg_mutex,NULL);
   
    initServ(&msgServer);
  initUsrList();
  
    pwd=getpwuid(getuid());//***
    uname(&sysName); //***
   
    loginBordCast();//广播通知上线
    printFunMenu();
    memset(usrcmd,0,sizeof(usrcmd));
    pthread_create(&recvMsg,NULL,(void *)*recverPthread,&msgSock);
    pthread_create(&usrCmd,NULL,(void *)*getCmdPthread,&msgSock);
    //pthread_create(&recvFile,NULL,(void *)*recvFilePthread,&tcpSock);
    //pthread_create(&sendFile,NULL,(void *)*sendFilePthread,&tcpSock);
   
    pthread_join(recvMsg,NULL);
    pthread_join(usrCmd,NULL);
    //pthread_join(recvFile,NULL);
}
用到的常用命令和全局变量:


#ifndef __COMMANDS_H_
#define __COMMANDS_H_
#include stdio.h>
#include stdlib.h>
#include string.h>
#include unistd.h>
#include sys/socket.h>
#include arpa/inet.h>
#include netinet/in.h>
#include pwd.h>
#include sys/utsname.h>
#include "ipmsg.h"
//typedef struct filenode FILENODE;
typedef struct msg
{
    unsigned int version;
    unsigned int packetNo;
    char senderName[MAX_NAMEBUF];
    char senderHost[MAX_NAMEBUF];
    unsigned int commandNo;
    char additional[MAX_BUF];
    struct sockaddr_in ipAddr;
    //struct filenode *list;
   
}MSG;
int sendToMsg(int sockfd,MSG *sendmsg);
int msgParser(MSG *msgRecv,char *recvbuf);
int makeSendMsg(MSG *msgSend,char *usrInput,char *destip,int comFlag);
#endif
//===================================================================================
//文件名称: commands.c
//功能描述: 用到的常用命令和全局变量
//包含文件: commands.h ulits.h
//维护日期:
//===================================================================================
#include "commands.h"
#include "ulits.h"
struct passwd *pwd;
struct utsname sysName;
const char allHost[]="192.168.220.255";
int msgSock;
int tcpSock;
extern pthread_mutex_t ipmsg_mutex;
//===================================================================================
//函数名称: makeMsg
//功能描述:将字符串生成要发送的报文结构体格式
//函数参数:msg生成的报文结构体存放地址,usrinput用户输入,comflag 命令字
//返 回 值:构造成功返回1,失败返回0;
//===================================================================================
int makeSendMsg(MSG *msgSend,char *usrInput,char *destip,int comFlag)
{
        if(msgSend==NULL)
        {
            return 0;
        }
        bzero(msgSend,sizeof(msgSend));
        msgSend->version=1;
        msgSend->packetNo=(unsigned int)time(NULL);
        strcpy(msgSend->senderName,pwd->pw_name);
        strcpy(msgSend->senderHost,sysName.nodename);
     msgSend->commandNo=comFlag;
        memcpy(msgSend->additional,usrInput,sizeof(msgSend->additional));
        //
        msgSend->ipAddr.sin_family=AF_INET;
        msgSend->ipAddr.sin_port=htons(IPMSG_DEFAULT_PORT);
        //msgSend->ipAddr.sin_addr.s_addr=inet_addr(destip);
        inet_pton(AF_INET,destip,&msgSend->ipAddr.sin_addr);//loginMsg.ipAddr.sin_addr
        
        return 1;
}
//===================================================================================
//函数名称:msgParser
//功能描述:将接收到的recvbuf解析,解析结果保存到结构体
//函数参书:msgRecv解析结果保存地址,recvbuf接收到的字符串buf
//返 回 值:int 成功返回1,失败返回0;
//===================================================================================
int msgParser(MSG *msgRecv,char *recvbuf)
{
    char *arg[10];
    char filebuf[1024];
    unsigned int len=0;
    assert(recvbuf!=NULL);
   
    if(msgRecv==NULL)
    {
        return 0;
    }
    bzero(msgRecv,sizeof(msgRecv));
   
    trim(recvbuf,1);
    pthread_mutex_lock(&ipmsg_mutex);//--------pthread_mutex_lock();
    strSplit(recvbuf,":",arg);
    pthread_mutex_unlock(&ipmsg_mutex);//------pthread_mutex_unlock;
    msgRecv->version=atoi(arg[0]);
    msgRecv->packetNo=atoi(arg[1]);
    strcpy(msgRecv->senderName,arg[2]);
    strcpy(msgRecv->senderHost,arg[3]);
    msgRecv->commandNo=atoi(arg[4]);
    strcpy(msgRecv->additional,arg[5]);
   
    return 1;
}
//========================================================================================
//函数名称:sendToMsg(int sockfd,MSG *sendmsg);
//功能描述:将结构体类型的数据发送出去
//函数参数:sockfd发送的sockfd对象,sendmsg发送的数据包结构体
//返 回 值:int
//===========================================================================================
int sendToMsg(int sockfd,MSG *sendmsg)
{
    char sendbuf[2408];   
   
    if(sendmsg==NULL)
    {
        perror("sendToMsg: send err!\n");
        exit(1);
    }
    sprintf(sendbuf,"%u:%u:%s:%s:%u:%s",sendmsg->version,
                                                                            sendmsg->packetNo,
                                                                            sendmsg->senderName,
                                                                            sendmsg->senderHost,
                                                                            sendmsg->commandNo,
                                                                            sendmsg->additional);
   
    //len=strlen(sendbuf);
    //printf("sendbuf=%s\n",sendbuf);
    sendto(sockfd,sendbuf,strlen(sendbuf),0,(struct sockaddr*)&sendmsg->ipAddr,sizeof(sendmsg->ipAddr));
    //port=ntohs(sendmsg->ipAddr.sin_port);
    return 0;                           
}
//=============funtion test----
/*
int main(int argc,char *argv[])
{
    char usrinput[60]="hello world!";
    char recvbuf[60]="1:1235:user name:host name:32:hello world";
   
    MSG msgSend;
    MSG msgRecv;
   
    pwd=getpwuid(getuid());
    uname(&sysName);
   
    makeSendMsg(&msgSend,usrinput,33);
    printf("----print msgsend-----------\n");
    printf("version=%d\n",msgSend.version);
    printf("packetNo=%d\n",msgSend.packetNo);
    printf("senderName=%s\n",msgSend.senderName);
    printf("senderHost=%s\n",msgSend.senderHost);
    printf("commandNo=%d\n",msgSend.commandNo);
    printf("additional=%s\n",msgSend.additional);
   
    printf("----print msgrecv-----------\n");
    msgParser(&msgRecv,recvbuf);
    printf("version=%d\n",msgRecv.version);
    printf("packetNo=%d\n",msgRecv.packetNo);
    printf("senderName=%s\n",msgRecv.senderName);
    printf("senderHost=%s\n",msgRecv.senderHost);
    printf("commandNo=%d\n",msgRecv.commandNo);
    printf("additional=%s\n",msgRecv.additional);
    return 0;
}
*/
用户管理模块:

//=============================================================
// 文件名称:
// 功能描述:用户管理链表
// 维护记录: by dengke
//=============================================================
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
typedef struct usr_info_t {
    struct usr_info_t *next;
    unsigned int num;
    char *usrname;
    char *hostname;
    char *ipaddr;
} USERINFO, *PUSERINFO;
void initUsrList(void);
int addUsr(char *name, char *hostname,char *ipaddr);
int delUsr(PUSERINFO usr);
int listUsr(FILE *file);
PUSERINFO findUsrByName(char *name);
PUSERINFO findUsrByNum(unsigned int number);
#ifdef __cplusplus
};
#endif
//=============================================================
// 文件名称:usrlist.c
// 功能描述:通用链表修改成的myUsrList链表, **注释**部分为要注意修改的地方
//
//
//
//包含文件:usrlist.h lnklst.h
// 维护记录:2009-05-08 V1.1 by lijian
//=============================================================
#include stdlib.h>
#include stdio.h>
#include unistd.h>
#include fcntl.h>
#include errno.h>
#include string.h>
#include "lnklst.h"
#include "usrlist.h"
//===============================================================================
static PUSERINFO myUsrList = NULL;//链表头在这里定义
static unsigned int count;
//========================================================================================
//函数名称:delUsrEx(PUSERINFO usr)
//功能描述:释放节点所占用的堆内存空间
//函数参数:usr要释放的节点指针
//返 回 值:
//===========================================================================================
static void delUsrEx(PUSERINFO usr)
{
    if(usr->usrname)
        free(usr->usrname);
    if(usr->hostname)
        free(usr->hostname);
    if(usr->ipaddr)
        free(usr->ipaddr);
    free(usr);
}
//==========================================================================================
//函数名称:destroyUsrList(void)
//功能描述:链表初始化,所有内存空间清0
//函数参数:void
//返回值:
//=============================================================================================
static void destroyUsrList(void)
{
    PUSERINFO tmpNod = myUsrList; //*****************这里要修改*********************
    while(tmpNod)
    {
        PUSERINFO tmp = tmpNod->next;
        delUsrEx(tmpNod); //清空节点所占的内存
        tmpNod = tmp;
    }
}
/***********************************以下为用户使用接口****************************************/
//=============================================================================================
//函数名称:initUsrList(void)
//功能描述:调用destroyUsrList来清空链表,完成初始化
//函数参数:
//返 回 值:
//============================================================================================
void initUsrList(void)
{
    if(myUsrList) //*************这里要修改**********
    {
        destroyUsrList();
    }
    myUsrList = NULL;
}
//=============================================================================================
//函数名称:addUsr(char *name, char *host,char *ip)
//功能描述:在链表中插入一个节点
//函数参数:name、host、ip节点信息指针
//返回值:
//============================================================================================
int addUsr(char *name, char *host,char *ip) //使用通用链表时此函数必须修改
{
    PUSERINFO newusr = (PUSERINFO)malloc(sizeof(USERINFO));
    if(newusr == NULL)
        return -ENOMEM;
        
    newusr->usrname = (char *)malloc(strlen(name) + 1);
    if(newusr->usrname == NULL)
    {
        free(newusr);
        return -ENOMEM;
    }
   
    newusr->hostname = (char *)malloc(strlen(host) + 1);
    if(newusr->hostname == NULL)
    {
        free(newusr->usrname);
        free(newusr);
        return -ENOMEM;
    }
   
    newusr->ipaddr = (char *)malloc(strlen(ip) + 1);
    if(newusr->ipaddr == NULL)
    {
        free(newusr->ipaddr);
        free(newusr);
        return -ENOMEM;
    }
   
    newusr->num=count;
    strcpy(newusr->usrname, name);
    strcpy(newusr->hostname, host);
    strcpy(newusr->ipaddr, ip);
    count++;
    //pthread_mutext_lock();
    add_node((void**)&myUsrList, newusr); //*****************这里要修改*****************
    //pthread_mutext_unlock();
    return 0;
}
//=============================================================================================
//函数名称:delUsr(PUSERINFO usr)
//功能描述:调用函数del_node从链表中删除一个节点
//函数参数:usr要从链表中删除节点
//返回值: 成功返回0,失败返回-1
//==============================================================================================
int delUsr(PUSERINFO usr)
{
    if(usr==NULL)
    {
     printf("node is not found!\n");   
     return -1;
    }
    del_node((void**)&myUsrList, usr); //这里要注意修改
    delUsrEx(usr);
    count--;
    return 0;
}
//===============================================================================================
//函数名称:findUsrByName(char *name)
//功能描述:通过name查找节点
//函数参数:name要查找的节点关键字
//返 回 值:找到的节点的结构体指针,没找到为null
//===============================================================================================
PUSERINFO findUsrByName(char *name)
{
    PUSERINFO ret = NULL;
    PUSERINFO tmpNod = myUsrList;
    while(tmpNod)
    {
        if(strcmp(tmpNod->usrname, name) == 0)
        {
            ret = tmpNod;
            break;
        }
        tmpNod = tmpNod->next;
    }
    return ret;
}
//=================================================================================================
//函数名称:
//功能描述:通过num查找节点
//函数参数:
//返回值:
//=================================================================================================
PUSERINFO findUsrByNum(unsigned int number)
{
    //printf("find ok\n");
    PUSERINFO ret = NULL;
    PUSERINFO tmpNod = myUsrList;
    while(tmpNod)
    {
        if(tmpNod->num == number)
        {
            ret = tmpNod;
            break;
        }
        tmpNod = tmpNod->next;
    }
    return ret;
}
//=================================================================================================
//函数名称:
//功能描述:打印输出链表
//函数参数:FIlE *file输出终端,显示器为,stdout
//返 回 值:输出链表个数
//=================================================================================================
int listUsr(FILE *file)
{
    int count = 1;
    char temp[10];
    PUSERINFO usr = myUsrList;
    if(usr == NULL)
        fprintf(file, "User List is empty!\n");
    else
    {
        fprintf(file, "%6s %20s %20s %20s\n", "num", "Name", "hostname","ipaddr");
        while(usr)
        {
            fprintf(file,"%6d %20s %20s %20s\n", usr->num, usr->usrname, usr->hostname,usr->ipaddr);
            usr = usr->next;
        }
        //fprintf(file, "%d users found!\n", count);
    }
    return count;
}
/*
int main()
{
    addUsr("usrname1", "host1","192.168.220.1");
    listUsr(stdout);
    addUsr("usrname2", "host2","192.168.220.2");
    addUsr("usrname3", "host3","192.168.220.3");
    addUsr("usrname4", "host4","192.168.220.4");
    addUsr("usrname5", "host5","192.168.220.5");
    listUsr(stdout);
    //delUsr(findUsrByName("usrname3"));
    delUsr(findUsrByNum(3));
    //delUsr("usrname8");
    listUsr(stdout);
    printf("init list...\n");
    initUsrList();
    listUsr(stdout);
    return 0;
}
*/


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/94835/showart_1924724.html

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-09-15 06:20:00
2 [报告]
发表于 2014-12-13 20:09 |只看该作者
摘抄的哦,请问有没有用到队列,你有没有试过这些代码。请教一下上边的代码,如果当其他人发来消息。是
不是可以打断当前聊天的线程。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP