利用C实现聊天室搭建 附带客户端与服务器的代码

利用C语言实现聊天室,首先要搭建一个C/S模型


1:服务端需要拥有一个文件来存放用户名和密码;

每个用户在注册时即创建一个自己的文件,其他用户向该用户发送消息时存放在这个文件里;

2:客户端需要拥有一个系统文件和不同好友之间的聊天文件;

A通过读取服务器中的A文件,将里面的消息分别存放到A的系统消息文件和聊天文件里;

3:C/S之间传递消息利用SOCKET;

参考:http://blog.csdn.net/wjb123sw99/article/details/76898877


搭建聊天室难点有3:

1:实现客户端与服务器的通信

2:实现服务器对多个客户端的服务

3:客户端实现动态聊天;输入的文字不受屏幕上不断输出的文字的影响

首先我们先建立一个简单的1对1 C\S模型


// vi ser.c
#include<stdio.h> 
#include<string.h>
#include<sys/types.h>
#include<error.h>
#include<sys/socket.h>
#include<netinet/in.h>
int main()                //服务器端
{
    int socket_fd,connect_fd;
    char buff[1000]={0};
    struct sockaddr_in servaddr;
    socket_fd=socket(AF_INET,SOCK_STREAM,0);   //创建一个套接字
    servaddr.sin_family=AF_INET;     
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
    servaddr.sin_port=htons(8000);
    if ( bind(socket_fd,(struct sockaddr*)&servaddr,sizeof(servaddr) )==-1)   //给套接字绑定端口和协议
    {
       printf("bind error!\n");   //如果出错,试试等会再运行
       return 0;
    }
    listen(socket_fd,10);       //监听套接字
    connect_fd=accept(socket_fd,NULL,NULL);   //同意链接
    while(1)
    {
        if(recv(connect_fd,buff,999,0)==0)   //接受数据   
            break;             //如果连接断开则停止循环
        printf("get:%s",buff);  //输出接受数据的内容
    }
    close(connect_fd);
    close(socket_fd);
    return 0;
}

//vi lic.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
int main(int argc, char** argv)   //客户端
{
    if(argc!=2)   
        return 0;
    int sockfd;
    char buff[1000]={0};
    struct sockaddr_in servaddr;
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    servaddr.sin_family = AF_INET;   //iv4协议
    servaddr.sin_port = htons(8000);  //8000端口
    inet_pton(AF_INET, argv[1], &servaddr.sin_addr);  //指定IP地址  
    if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)  //链接服务器  
    {
        printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
        return 0;
    }
    while(1)
    {
        printf("Enter:");      
        fgets(buff,998,stdin);
        send(sockfd,buff,strlen(buff),0);
    }
首先编译源代码
gcc ser.c -o ser

gcc lic.c -o lic

如何查看服务器IP

ifconfig

最后搭建c/s

./ser

./lic.c xxx.xxx.xxx.xxx

结果展示



在1对1基础上搭建1对多 C/S模型

注意避免僵尸进程的产生

这里我们只需修改服务器程序

多进程服务器搭建

#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<error.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<signal.h>
#include<sys/wait.h>
void handle()
{
    while(waitpid(-1,NULL,WNOHANG));  //处理完当前所有的僵尸进程
}
int main()       //服务端
{
    int socket_fd,connect_fd;
    char buff[1000]={0};
    struct sockaddr_in servaddr;
    socket_fd=socket(AF_INET,SOCK_STREAM,0);
    servaddr.sin_family=AF_INET;
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
    servaddr.sin_port=htons(8000);
    if ( bind(socket_fd,(struct sockaddr*)&servaddr,sizeof(servaddr) )==-1)
    { 
       printf("bind error!\n");
       return 0;
    }
    listen(socket_fd,10);
    while(1)
    {
        connect_fd=accept(socket_fd,NULL,NULL);
        if(!fork())   //每接受一个客户端开一个子进程
        {
            while(1)
            {
                if(recv(connect_fd,buff,999,0)==0)
                    return 0;
                printf("get:%s",buff);
            }
        }
        signal(SIGCHLD,handle);  //当子进程结束时,运行handle函数
    }
    return 0;
}

多线程服务器搭建

#include<stdio.h>  
#include<string.h>  
#include<sys/types.h>  
#include<error.h>  
#include<sys/socket.h>  
#include<netinet/in.h>  
#include<signal.h>  
#include<sys/wait.h>
#include <pthread.h>
void *thread(void *arg)
{
    int connect_fd=*(int *)arg;
    char buff[1000]={0};  
    while(1)  
    {  
        if(recv(connect_fd,buff,999,0)==0)  
           return ((void *)0);  
        printf("get:%s",buff); 
    } 
} 
 
int main()       //服务端  
{  
    int socket_fd,connect_fd;  
    struct sockaddr_in servaddr;  
    socket_fd=socket(AF_INET,SOCK_STREAM,0);  
    servaddr.sin_family=AF_INET;  
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY);  
    servaddr.sin_port=htons(8000);  
    if ( bind(socket_fd,(struct sockaddr*)&servaddr,sizeof(servaddr) )==-1)  
    {   
       printf("bind error!\n");  
       return 0;  
    }  
    listen(socket_fd,10);  
    while(1)  
    {
        connect_fd=accept(socket_fd,NULL,NULL);
        pthread_t id;
        int ret;
        ret=pthread_create(&id,NULL,thread,&connect_fd); // 成功返回0,错误返回错误编号
    }  
    return 0;  
}  


在1对多的C/S模型上搭建聊天室

基础功能如下:

1:实现注册新用户和登录的功能

2:可以添加好友

3:可以和好友聊天

完善的功能:

1:查看当前好友是否在线

2:修改昵称

3:实现多人聊天(第三个功能,博主懒,没去码,感兴趣的可以去实现)


分享代码:

客户端和服务端必须在不同目录下运行!!!!!

服务端代码如下

ser.c

#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<errno.h>  
#include<sys/types.h>  
#include<sys/socket.h>  
#include<netinet/in.h>  
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>

typedef struct userinfo
{
    char id[20];
    char codes[20];
    char name[20];
    struct userinfo *next;
    int friendnum;
    int state;
    char friend[100][2][20];
}user;
user *head,*tail,nowuser,usenull;
#include"ser2.h"
int main(int argc, char** argv)  
{  
    int    socket_fd, connect_fd;  
    struct sockaddr_in     servaddr;  
    char    buff[4096];  
    if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
    {  
      printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);  
      exit(0);  
    }  
    memset(&servaddr, 0, sizeof(servaddr));  
    servaddr.sin_family = AF_INET;  
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);  
    servaddr.sin_port = htons(8000);  
    if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
    {  
        printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);  
        exit(0);  
    }  
    if( listen(socket_fd, 10) == -1)
    {  
        printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);  
        exit(0);  
    }  
    printf("======waiting for client's request======\n");    //main 
    while(1)
    {  
       printf("wait......\n");
        if( (connect_fd = accept(socket_fd, (struct sockaddr*)NULL, NULL)) == -1)
        {  
            printf("accept socket error: %s(errno: %d)",strerror(errno),errno);  
            continue;  
        } 
        printf("get a new cli\n"); 
        while(!fork())    //a new ser to a cli
        {
            int n=0;
            n = recv(connect_fd, buff, 4095, 0);  
            if(0==n)
                return 0;
            buff[n] = '\0';
            printf("recv msg from client: %s\n", buff);
            char login[]="login\n";   //login id
            char sign[]="sign\n";
            char quit[]="quit\n";
            char change[]="change name\n";
            char addfr[]="add a friend\n";
            char check[]="check file\n";
            char chat[]="i went to chat\n";
            char renew[]="renew data\n";
            char agree[]="agree friend\n";
            char seefriend[]="see friend\n";
            printf("%s",buff);
            if(strcmp(buff,seefriend)==0)
            {
                char seefi[20]={0};
                recv(connect_fd,seefi,20,0);
                seefr(connect_fd,seefi);
            }
            if(strcmp(buff,agree)==0)
            {
                char agreeid[4096]={0};
                recv(connect_fd,agreeid,20,0);
                agreefriend(agreeid);
                send(connect_fd,&nowuser,sizeof(user),0);
            } 
            if(strcmp(buff,renew)==0)
            {
                printf("i am renew my data!!!!!!!!!!!!!!!!!!\n");
    FILE *fp=fopen("./userset","a+");
    int number=0;
    fread(&number,4,1,fp);
    printf("user have %d\n",number);
    tail=&usenull;
    for(;number>0;number--)
    {
        int oldsize=0;
        fread(&oldsize,4,1,fp);
        user *olduser=(user *)malloc(oldsize);
        fread(olduser,oldsize,1,fp);
        olduser->next=NULL;
        tail->next=olduser;
        tail=tail->next;
    }
    fclose(fp);
    tail=&usenull;
    int idture=0;
    while(tail->next!=NULL)
    {
        tail=tail->next;
        if( strcmp(nowuser.id,tail->id)==0 )
        {
            idture++;
            break;
        }
    }
    printf("my friend number is %d\n",tail->friendnum);
    nowuser=*tail;
    freeuser();

                printf("my firend number have %d\n",nowuser.friendnum);   //
                send(connect_fd,&nowuser,sizeof(user),0);
                printf("i am renew data\n");
                printf("this id is %s",nowuser.id);
                int ren=strlen(nowuser.id);
                printf("id len is %di\n",ren);
                char renewuser[20]={0};
                strcpy(renewuser,nowuser.id);
                printf("cmp id id %s",renewuser);
                renewuser[ren-1]='\0';
                FILE *fl=fopen(renewuser,"a+");
                printf("i open the file %s!\n",renewuser);
                int renewstate;
                while(1)
                {
                    renewstate=0;
                    printf("i will read state\n");
                    fread(&renewstate,4,1,fl);
                    printf("i am read state is %d\n",renewstate);
                    if(renewstate==0)
                    {
                        send(connect_fd,"read over\n",20,0);
                        printf("read over\n");
                        break;
                    }
                    if(renewstate==1)
                    {
                        char success[20]={0};
                        send(connect_fd,"request news\n",20,0);
                        recv(connect_fd,success,20,0);
                        printf("%s",success);
                        printf("request news\n");
                        int renewsize;
                        fread(&renewstate,4,1,fl);
                        printf("len %d\n",renewstate);
                        char renewid[20]={0};
                        fread(&renewid,20,1,fl);
                        printf("read id is %s!\n",renewid);
                        send(connect_fd,renewid,20,0);
                    }
                    if(renewstate==3)
                    {
                        char renewid[20]={0};
                        fread(renewid,20,1,fl);
                        printf("i get new form %s !",renewid);
                        int renewsize;
                        fread(&renewsize,4,1,fl);
                        printf("renewsize=%d\n",renewsize);
                        char renewbuf[4096]={0};
                        fread(renewbuf,renewsize,1,fl);
                        printf("new is %s",renewbuf);
                        send(connect_fd,"chat news\n",20,0);
                        sleep(1);
                        send(connect_fd,renewid,20,0);
                        sleep(1);
                        send(connect_fd,&renewsize,4,0);
                        sleep(1);
                        send(connect_fd,renewbuf,renewsize,0);
                    }
                }
                fclose(fl);
                fl=fopen(renewuser,"w+");
                fclose(fl);
            }    
            if(strcmp(buff,chat)==0)
            {
                printf("user went to chat!\n");
                char chatname[20]={0};
                recv(connect_fd,chatname,20,0);
                printf("chatid is %s",chatname);
                int chatlen=strlen(chatname);
                chatname[chatlen-1]='\0';
                printf("file is %s!\n",chatname);
                FILE *fk=fopen(chatname,"a+");
                int chatstate=3;
                fwrite(&chatstate,4,1,fk);
                fwrite(nowuser.id,20,1,fk);
                char chatbuff[4096]={0};
                printf("s1\n");
                recv(connect_fd,chatbuff,4095,0);
                printf("s2\n");
                printf("new is %s\n",chatbuff);  
                int chatsize=0;
                chatsize=strlen(chatbuff)+1;
                
                fwrite(&chatsize,4,1,fk);
                fwrite(chatbuff,chatsize,1,fk);
                fclose(fk);
                printf("write over!\n");
            }
            if(strcmp(buff,check)==0)
            {
                int  newtype=0;
                char usfile[20];
                strcpy(usfile,nowuser.id);
                int usfilesize=strlen(usfile);
                usfile[usfilesize-1]='\0';
                printf("my file name is %s heihei\n",usfile);
                FILE *fj=fopen(usfile,"a+");
                while(1)
                {
                    sleep(1);
                    
                    newtype=0;
                    fread(&newtype,4,1,fj);
                    printf("i am read file state data %d\n",newtype);
                    if(newtype==0)
                    {
                        send(connect_fd,"system news read over\n",50,0);
                        fclose(fj);
                        break;
                    }
                    if(newtype==1)
                    {
                        char systemnew[4096]={0};
                        int  systemsize=0; 
                        fread(&systemsize,4,1,fj);   //requestor id size
                        fread(systemnew,systemsize,1,fj); //requertor id
                        int i4;   //check requertor have been now?
                        int i5=0;
                        for(i4=0;i4<nowuser.friendnum;i4++)
                        {
                            if(strcmp(nowuser.friend[i4][0],systemnew)==0)
                            {
                                i5++;
                                break;
                            }
                        }
                        if(i5>0)
                            continue;
                        send(connect_fd,"someone went to be your friend\n",50,0);
                        send(connect_fd,systemnew,4096,0);  
                        char n4[20]={0};
                        recv(connect_fd,n4,19,0);
                        if(strcmp(n4,"agree\n")==0)
                        {
                            agreefriend(systemnew);
                            printf("im new friend %s",nowuser.friend[nowuser.friendnum-1][0]);
                            printf("i have %d friend\n",nowuser.friendnum);
                            send(connect_fd,&nowuser,sizeof(user),0);
                            printf("send success\n");
                        }
                        
                        continue;
                    }
                }
                fj=fopen(usfile,"w+");
                close(fj);
            }    
            if(strcmp(buff,addfr)==0)
            {
                int n1=0;
                char addid[20]={0};
                recv(connect_fd,addid,19,0);
                printf("what is id?id is %s   su\n",addid);
                n1=addfriend(addid);
                if(n1==0)
                    send(connect_fd,"id not exist\n",50,0);
                if(n1==1)
                    send(connect_fd,"add friend request already sent\n",50,0);
            }
            if(strcmp(buff,change)==0)
            {
               int n1=0;
               char newname[20]={0};
               recv(connect_fd,newname,19,0);
               n1=changeuser(newname);
               if(n1==2)
                   send(connect_fd,"name change success\n",50,0);
               else
                   send(connect_fd,"name change error\n",50,0);
               sleep(1);
                   send(connect_fd,&nowuser,sizeof(user),0);
            }
            if(strcmp(buff,login)==0)
            {
                int n1;
                char newid[2][20]={0};
                recv(connect_fd, newid,40,0);
                n1=adduser(newid);
                if(n1==0)
                    send(connect_fd,"id has been registered\n",50,0);
                if(n1==1)
                    send(connect_fd,"id registration successful\n",50,0);
                continue;
            }
            if(strcmp(buff,sign)==0)
            {
                int n2;
                char newid[2][20]={0};
                recv(connect_fd,newid,40,0);
                n2=signset(newid);
                if(n2==0)
                    send(connect_fd,"id does not exist\n",50,0);
                if(n2==1)
                {
                    send(connect_fd,"lognin successful\n",50,0);
                    sleep(1);
                    send(connect_fd,&nowuser,sizeof(user),0);
                }
                if(n2==2)
                    send(connect_fd,"node is error\n",50,0);
                continue;
             }
            if(strcmp(buff,quit)==0)
            {
                if(send(connect_fd, "quit success\n", 26,0) == -1)
                    printf("error\n");
                quituser();
                close(connect_fd);
                return 0;
            } 
        }
        signal(SIGCHLD,killchild); 
        close(connect_fd);  
    }  
    close(socket_fd);  
}  

ser2.h

void killchild()
{
    while(waitpid(-1,NULL,WNOHANG));
}
void seach()
{
    tail=&usenull;
    while(tail->next!=NULL)
    {
        tail=tail->next;
        printf("id=%s\n",tail->id);
    }
}
void freeuser()
{
    head=&usenull;
    tail=head->next;
    while(head->next!=NULL)
    {
        while(tail->next=NULL)
        {
            tail=tail->next;
            head=head->next;
        }
        free(tail);
        head->next=NULL;
        head=&usenull;
        tail=head->next;
    }
}
int seefr(int connect_fd,char seefi[20])
{
    FILE *fp=fopen("./userset","a+");
    int number=0;
    fread(&number,4,1,fp);
    printf("user have %d\n",number);
    tail=&usenull;
    for(;number>0;number--)
    {
        int oldsize=0;
        fread(&oldsize,4,1,fp);
        user *olduser=(user *)malloc(oldsize);
        fread(olduser,oldsize,1,fp);
        printf("i am read a user,name is %s\n",olduser->id);
        olduser->next=NULL;
        tail->next=olduser;
        tail=tail->next;
    }
    fclose(fp);
    tail=&usenull;
    int idture=0;
    while(tail->next!=NULL)
    {
        tail=tail->next;
        if( strcmp(seefi,tail->id)==0 )
        {
            idture++;
            break;
        }
    }
    send(connect_fd,&(tail->state),4,0);
    freeuser();
    return 0;
}
int quituser()
{
    printf("i will quit\n");
    FILE *fp=fopen("./userset","a+");
    int number=0;
    fread(&number,4,1,fp);
    printf("user have %d\n",number);
    tail=&usenull;
    for(;number>0;number--)
    {
        int oldsize=0;
        fread(&oldsize,4,1,fp);
        user *olduser=(user *)malloc(oldsize);
        fread(olduser,oldsize,1,fp);
        printf("i am read a user,name is %s\n",olduser->id);
        olduser->next=NULL;
        tail->next=olduser;
        tail=tail->next;
    }
    fclose(fp);
    tail=&usenull;
    int idture=0;
    while(tail->next!=NULL)
    {
        tail=tail->next;
        if( strcmp(nowuser.id,tail->id)==0 )
        {
            idture++;
            break;
        }
    }
    tail->state=0;
    FILE *fd=fopen("./userset","w+");   //write new data
    int newnumber=0;
    tail=&usenull;
    while(tail->next!=NULL)
    {
        newnumber++;
        tail=tail->next;
    }
    printf("new user have %d\n",newnumber);
    fwrite(&newnumber,4,1,fd);
    tail=&usenull;
    tail=tail->next;
    while(tail!=NULL)
    {
        int newsize=sizeof(user);
        fwrite(&newsize,4,1,fd);
        printf("id %s have write file\n",tail->id);
        printf("state is %d\n",tail->state);
        fwrite(tail,newsize,1,fd);
        tail=tail->next;
    }
    fclose(fd);
    freeuser();
}
int renewuser()
{
    printf("i am renew my data!!!!!!!!!!!!!!!!!!\n");
    FILE *fp=fopen("./userset","a+");
    int number=0;
    fread(&number,4,1,fp);
    printf("user have %d\n",number);
    tail=&usenull;
    for(;number>0;number--)
    {
        int oldsize=0;
        fread(&oldsize,4,1,fp);
        user *olduser=(user *)malloc(oldsize);
        fread(olduser,oldsize,1,fp);
        olduser->next=NULL;
        tail->next=olduser;
        tail=tail->next;
    }
    fclose(fp);
    tail=&usenull;
    int idture=0;
    while(tail->next!=NULL)
    {
        tail=tail->next;
        if( strcmp(nowuser.id,tail->id)==0 )
        {
            idture++;
            break;
        }
    }
    printf("my friend number is %d\n",tail->friendnum);
    nowuser=*tail;
    freeuser();
    return 0;
}

int adduser(char a[2][20])
{
    FILE *fp=fopen("./userset","a+");
    int number=0;
    fread(&number,4,1,fp);
    printf("user have %d\n",number);
    tail=&usenull;
    for(;number>0;number--)
    {
        int oldsize=0;
        fread(&oldsize,4,1,fp);
        user *olduser=(user *)malloc(oldsize);
        fread(olduser,oldsize,1,fp);
        printf("i am read a user,name is %s\n",olduser->id);
        olduser->next=NULL;
        tail->next=olduser;
        tail=tail->next;
    }
    fclose(fp);
    tail=&usenull;
    while(tail->next!=NULL)
    {
        tail=tail->next;
        if( strcmp(a[0],tail->id)==0 )
        {
            printf("this id has been\n");
            return 0;
        }
    }
    printf("this id is  not find\n");
    user *newuser=(user *)malloc(sizeof(user));   //init user
    strcpy(newuser->id,a[0]);
    strcpy(newuser->codes,a[1]);
    strcpy(newuser->name,a[0]);
    newuser->next=NULL;
    newuser->friendnum=0;
    newuser->state=0;
    tail->next=newuser;
    printf("filename is %s",a[0]);
    int cao=strlen(a[0]);
    a[0][cao-1]='\0';
    int asd=creat(a[0],666);         //creat myself file
    close(asd);
    FILE *fg=fopen(a[0],"w+");
    fclose(fg);
    printf("creat file successs\n"); 
    FILE *fd=fopen("./userset","w+");   //write new data
    int newnumber=0;
    tail=&usenull;
    while(tail->next!=NULL)
    {
        newnumber++;
        tail=tail->next;
    }
    printf("new user have %d\n",newnumber);
    fwrite(&newnumber,4,1,fd);
    tail=&usenull;
    tail=tail->next;
    while(tail!=NULL)
    {
        int newsize=sizeof(user);
        fwrite(&newsize,4,1,fd);
        printf("id %s have write file\n",tail->id);
        fwrite(tail,newsize,1,fd);
        tail=tail->next;
    }
    fclose(fd);
    freeuser();
    return 1;
}
int signset(char a[2][20])
{
    FILE *fp=fopen("./userset","a+");
    int number=0;
    fread(&number,4,1,fp);
    printf("user have %d\n",number);
    tail=&usenull;
    for(;number>0;number--)
    {
        int oldsize=0;
        fread(&oldsize,4,1,fp);
        user *olduser=(user *)malloc(oldsize);
        fread(olduser,oldsize,1,fp);
        printf("i am read a user,name is %s\n",olduser->id);
        olduser->next=NULL;
        tail->next=olduser;
        tail=tail->next;
    }
    fclose(fp); 
    tail=&usenull;
    int idture=0;
    while(tail->next!=NULL)
    {
        tail=tail->next;
        if( strcmp(a[0],tail->id)==0 )
        {
            idture++;
            break;
        }
    }
    if(idture==0)
    {
        freeuser();
        return 0;
    }
    if(strcmp(a[1],tail->codes)==0)    //sign success
    {
        tail->state=1;
        nowuser=*tail;
        FILE *fd=fopen("./userset","w+");   //write new data
        int newnumber=0;
        tail=&usenull;
        while(tail->next!=NULL)
        {
            newnumber++;
            tail=tail->next;
        }
        printf("new user have %d\n",newnumber);
        fwrite(&newnumber,4,1,fd);
        tail=&usenull;
        tail=tail->next;
        while(tail!=NULL)
        {
            int newsize=sizeof(user);
            fwrite(&newsize,4,1,fd);
            printf("id %s have write file\n",tail->id);
            fwrite(tail,newsize,1,fd);
            tail=tail->next;
        }
        fclose(fd);
        freeuser();
        return 1;
    }
    freeuser();
    return 2;
}
int changeuser( char newname[20])
{
    FILE *fp=fopen("./userset","a+");
    int number=0;
    fread(&number,4,1,fp);
    printf("user have %d\n",number);
    tail=&usenull;
    for(;number>0;number--)
    {
        int oldsize=0;
        fread(&oldsize,4,1,fp);
        user *olduser=(user *)malloc(oldsize);
        fread(olduser,oldsize,1,fp);
        printf("i am read a user,name is %s\n",olduser->id);
        olduser->next=NULL;
        tail->next=olduser;
        tail=tail->next;
    }
    fclose(fp);
    tail=&usenull;
    while(tail->next!=NULL)
    {
        tail=tail->next;
        if( strcmp(nowuser.id,tail->id)==0 )
        {
            printf("this id has been\n");
            break;
        }
    }
    strcpy(tail->name,newname);
    nowuser=*tail;
    FILE *fd=fopen("./userset","w+");
    int newnumber=0;
    tail=&usenull;
    while(tail->next!=NULL)
    {
        newnumber++;
        tail=tail->next;
    }
    printf("new user have %d\n",newnumber);
    fwrite(&newnumber,4,1,fd);
    tail=&usenull;
    tail=tail->next;
    while(tail!=NULL)
    {
        int newsize=sizeof(user);
        fwrite(&newsize,4,1,fd);
        printf("id %s have write file\n",tail->id);
        fwrite(tail,newsize,1,fd);
        tail=tail->next;
    }
    fclose(fd);
    freeuser(); 
    return 2;
}
int addfriend(char a[20])
{
    FILE *fp=fopen("./userset","a+");   //is there a judgment?
    int number=0;
    fread(&number,4,1,fp);
    printf("user have %d\n",number);
    tail=&usenull;
    for(;number>0;number--)
    {
        int oldsize=0;
        fread(&oldsize,4,1,fp);
        user *olduser=(user *)malloc(oldsize);
        fread(olduser,oldsize,1,fp);
        printf("i am read a user,name is %s\n",olduser->id);
        olduser->next=NULL;
        tail->next=olduser;
        tail=tail->next;
    }
    fclose(fp);
    tail=&usenull;
    int addtree=0;
    while(tail->next!=NULL)
    {
        tail=tail->next;
        if( strcmp(a,tail->id)==0 )
        {
            printf("this id has been\n");
            addtree++;       //judgment
            break;
        }
    }
    if(addtree==0)
       return 0;     //id id not judgment
    char adf[20];
    strcpy(adf,tail->id);
    int adfsize=strlen(adf);
    adf[adfsize-1]='\0';
    freeuser();
    printf("open file name is %s\n",adf);
    FILE *fh=fopen(adf,"a+");
    int newsstate=1;
    fwrite(&newsstate,4,1,fh);
    int newssize=20;
    fwrite(&newssize,4,1,fh);
    fwrite(nowuser.id,newssize,1,fh);
    fclose(fh);
    return 1;
}
int agreefriend(char systemnew[4096])
{
    FILE *fp=fopen("./userset","a+");   //see you are there?
    int number=0;
    fread(&number,4,1,fp);
    printf("user have %d\n",number);
    tail=&usenull;
    for(;number>0;number--)
    {
        int oldsize=0;
        fread(&oldsize,4,1,fp);
        user *olduser=(user *)malloc(oldsize);
        fread(olduser,oldsize,1,fp);
        printf("i am read a user,name is %s\n",olduser->id);
        olduser->next=NULL;
        tail->next=olduser;
        tail=tail->next;
    }
    fclose(fp);
    tail=&usenull;
    while(tail->next!=NULL)
    {
        tail=tail->next;
        if( strcmp(systemnew,tail->id)==0 )
        {
            printf("on i find he,i agree withe you be friend\n");
            break;
        }
    }
    nowuser.friendnum+=1;  //friend+1;
    strcpy(nowuser.friend[nowuser.friendnum-1][0],tail->id);
    strcpy(nowuser.friend[nowuser.friendnum-1][1],tail->name);
    tail->friendnum+=1;
    strcpy(tail->friend[tail->friendnum-1][0],nowuser.id);
    strcpy(tail->friend[tail->friendnum-1][1],nowuser.name);
    tail=&usenull;
    while(tail->next!=NULL)
    {
        tail=tail->next;
        if( strcmp(nowuser.id,tail->id)==0 )
        {
            printf("i find myself in file\n");
            break;
        }
    }
    nowuser.next=tail->next;
    *tail=nowuser;
    /*  i will updata to file*/
    FILE *fd=fopen("./userset","w+");   //write new data
    int newnumber=0;
    tail=&usenull;
    while(tail->next!=NULL)
    {
        newnumber++;
        tail=tail->next;
    }
    printf("new user have %d\n",newnumber);
    fwrite(&newnumber,4,1,fd);
    tail=&usenull;
    tail=tail->next;
    while(tail!=NULL)
    {
        int newsize=sizeof(user);
        fwrite(&newsize,4,1,fd);
        printf("id %s have write file\n",tail->id);
        fwrite(tail,newsize,1,fd);
        tail=tail->next;
    }
    fclose(fd);
    freeuser();
    return 0;
}

客户端代码如下

lic.c

#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<errno.h>  
#include<sys/types.h>  
#include<sys/socket.h>  
#include<netinet/in.h>
#include <time.h>  
#include<signal.h>
#include<unistd.h>
typedef struct userinfo
{
    char id[20];
    char codes[20];
    char name[20];
    struct userinfo *next;
    int friendnum;
    int state;
    char friend[100][2][20];
}user;
user myuser;
int sockfd_wjb;
int chat_wjb;
char chatid_wjb[20]={0};
int alarmstate;
#include"lic.h" 
int main(int argc, char** argv)  
{  
    int    sockfd, n,rec_len;  
    char    recvline[4096], sendline[4096];  
    char    buf[4095];  
    struct sockaddr_in servaddr;   
    if( argc != 2)
    {  
        printf("usage: ./client <ipaddress>\n");  
        exit(0);  
    }  
    if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {  
        printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);  
        exit(0);  
    }  
    memset(&servaddr, 0, sizeof(servaddr));  
    servaddr.sin_family = AF_INET;  
    servaddr.sin_port = htons(8000);  
    if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
    {  
        printf("inet_pton error for %s\n",argv[1]);  
        exit(0);  
    }  
    if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
    {  
        printf("connect error: %s(errno: %d)\n",strerror(errno),errno);  
        exit(0);  
    } 
    char a[2][20];
    while(1)
    {
        int b=face1(a);
        if(b==1)
        {
            char login[]="login\n";
            char num[4096]={0};
            send(sockfd,login,strlen(login),0);
            send(sockfd,a,sizeof(a),0);
            recv(sockfd,num,4095,0);
            printf("get:%s",num);
            getchar();
            if(strcmp(num,"id has been registered\n")==0)
                continue;
            if(strcmp(num,"id registration successful\n")==0)
                continue;
         }
         if(b==0)
         {
             char sign[]="sign\n";
             char num[4096]={0};
             send(sockfd,sign,strlen(sign),0);
             send(sockfd,a,sizeof(a),0);
             recv(sockfd,num,4095,0);
             printf("get:%s",num);
             getchar();
             if( strcmp(num,"id does not exist\n")==0 )
                 continue;
             if( strcmp(num,"node is error\n") ==0 )
                 continue;
             if( strcmp(num,"lognin successful\n")==0 )
                 break;      
          }
    }
    printf("1\n");
    recv(sockfd,&myuser,4095,0);
    printf("2\n");
    creatfile();
    printf("3\n");
    renew(sockfd);
    printf("4\n");
    while(1)
    {   
        int sele=face2();
        if(sele==6)
        {
            while(1)
            {
                 printf("please enter you went chat friend id\n");
                 printf("Enter:");
                 char chatid[20]={0};
                 fgets(chatid,20,stdin);
                 int i5=0;
                 int i5a=0;
                 for(i5=0;i5<myuser.friendnum;i5++)
                 {
                      if(strcmp(chatid,myuser.friend[i5][0])==0)
                      {
                           i5a++;
                           break;
                      }
                 }
                 if(i5a==0)
                 {
                      char n6[5]={0};
                      while(1)
                      {
                          printf("this id not your friend!\n");
                          printf("1:return main inteface\n");
                          printf("2:continue\n");
                          printf("enter:");
                          fgets(n6,3,stdin);
                          if(strcmp(n6,"1\n")==0)
                              break;
                          if(strcmp(n6,"2\n")==0)
                              break;
                      }
                      if(strcmp(n6,"1\n")==0)
                          break;
                      if(strcmp(n6,"2\n")==0)
                          continue;
                 }
                 if(i5a!=0)
                 {
                     printf("shi is you friend\n"); 
                     sockfd_wjb=sockfd;
                     strcpy(chatid_wjb,chatid);
                     chatroom(sockfd,chatid);
                     printf("chat over!");
                     getchar();
                     break;
                 }
            }
        }
        if(sele==2)
        {
            strcpy(sendline,"quit\n");
            if( send(sockfd, sendline, strlen(sendline), 0) < 0)  
            {  
                printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);  
                exit(0);  
            }  
            sleep(1);
            if((rec_len = recv(sockfd, buf, 4095,0)) == -1) 
            {  
                perror("recv error");  
                exit(1);  
            }  
            buf[rec_len]  = '\0';  
            printf("get: %s ",buf);
            char quit[]="quit success\n";
            if(strcmp(buf,quit)==0)
            break;
        }
        if(sele==1)
        {
            strcpy(sendline,"change name\n");
            if( send(sockfd, sendline, strlen(sendline), 0) < 0)  
            {  
                printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);  
                exit(0);  
            }  
            printf("enter you went name:");
            char newname[20];
            fgets(newname,20,stdin);
            if( send(sockfd, newname, strlen(newname), 0) < 0)  
            {  
                printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);  
                exit(0);  
            }  
            if((rec_len = recv(sockfd, buf, 4095,0)) == -1) 
            {  
                perror("recv error");  
                exit(1);  
            }  
            buf[rec_len]  = '\0';  
            printf("get:%s",buf); 
            recv(sockfd,&myuser,4095,0);
            getchar();
        }
        if(sele==3)
            seefriend(sockfd);
        if(sele==4)
        {
            strcpy(sendline,"add a friend\n");
            char addid[20]={0};
            printf("please enter you went add id:");
            fgets(addid,19,stdin);
            int adda;
            int addab=0;
            for(adda;adda<myuser.friendnum;adda++)
            {
                if( strcmp(myuser.friend[adda][0],addid)==0 )
                {
                    printf("he has been you friend,not add\n");
                    addab=1;
                    break;
                }
            }
            if(addab==1)
                continue;
            if( send(sockfd, sendline, strlen(sendline), 0) < 0)  
            {  
                printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);  
                exit(0);  
            }  
            if( send(sockfd, addid, strlen(addid), 0) < 0)  
            {  
                printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);  
                exit(0);  
            }  
            if((rec_len = recv(sockfd, buf, 4095,0)) == -1) 
            {  
                perror("recv error");  
                exit(1);  
            }  
            buf[rec_len]  = '\0';  
            printf("get:%s",buf);
            getchar();
        } 
        if(sele==5)
        {
            renew(sockfd);
            char systemid[20]={0};
            int systemlen=strlen(myuser.id);
            strcpy(systemid,myuser.id);
            systemid[systemlen-1]='\0';
            FILE *fe=fopen(systemid,"a+");
            while(1)
            {
                int systemstate;
                systemstate=0;
                fread(&systemstate,4,1,fe);
                if(systemstate==0)
                    break;
                if(systemstate==1)
                {
                    int systemsize=0;
                    char systemid[20]={0};
                    fread(&systemsize,4,1,fe);
                    fread(systemid,20,1,fe);
                    while(1)
                    {
                        char agre[5]={0};
                        printf("shi went quester be your frienid:%s",systemid);
                        printf("agree to press 1\n");
                        printf("refuse to press 2\n");
                        fgets(agre,3,stdin);
                        if(strcmp(agre,"1\n")==0)
                        { 
                            send(sockfd,"agree friend\n",20,0);
                            sleep(1);
                            send(sockfd,systemid,20,0);
                            recv(sockfd,&myuser,4096,0);
                            break;
                        }
                        if(strcmp(agre,"2\n")==0)
                            break;
                    }
                }
            }
            fclose(fe);               
            fe=fopen(systemid,"w+");
            fclose(fe);               
        }      
    }
} 

lic.h

int face1(char a[2][20] )
{
    while(1)
    {
        system("clear");
        printf("----welcome to use SU chat room----\n");
        printf("If you already have an account,press 1\n");
        printf("If you do not  have an accout,press 2 to register\n");
        printf("Enter(1 or 2):");
        char num[5];
        fgets((char *)&num,5,stdin);
        if( strcmp(num,"1\n")==0)
        {
            printf("Please enter id:");
            fgets(a[0],20,stdin);
            printf("Please enter codes:");
            fgets(a[1],20,stdin);
            return 0;
        }
        if( strcmp(num,"2\n")==0 )
        {
            printf("Please enter id:");
            fgets(a[0],20,stdin);
            printf("Please enter codes:");
            fgets(a[1],20,stdin);
            return 1;
        }
     }
}
int face2()
{
    while(1)
    {
        char n[5]={0};
        system("clear");
        printf("------Hello %s\n",myuser.name);
        printf("1:Change name\n");
        printf("2:qiut\n");
        printf("3:see friend\n");
        printf("4:add frined\n");
        printf("5:seach system news\n");
        printf("6:chat friend\n");
        printf("pleace enter number:");
        fgets(n,3,stdin);
        if(strcmp(n,"1\n")==0)
            return 1;
        if(strcmp(n,"2\n")==0)
            return 2;
        if(strcmp(n,"3\n")==0)
            return 3;    
        if(strcmp(n,"4\n")==0)
            return 4;    
        if(strcmp(n,"5\n")==0)
            return 5;
        if(strcmp(n,"6\n")==0)
            return 6;
    }
}    
void creatfile()
{
     char myname[20]={0};
     strcpy(myname,myuser.id);
     int n=strlen(myname);
     myname[n-1]='\0';
     FILE *fd=fopen(myname,"a+");
     fclose(fd);
     int n1;
     for(n1=0;n1<myuser.friendnum;n1++)
     {
         char friendname[40]={0};
         strcpy(friendname,myuser.friend[n1][0]);
         n=strlen(friendname);
         friendname[n-1]='\0';
         printf("%s,,,,,%s\n",friendname,myname);
         strcat(friendname,myname);
         fd=fopen(friendname,"a+");
         fclose(fd);
     }
     printf("over\n");
}
int renew(int sockfd)
{
    send(sockfd,"renew data\n",20,0);
    recv(sockfd,&myuser,sizeof(user),0);
    while(1)
    {
        char renewstate[40]={0};
        recv(sockfd,renewstate,20,0);
        send(sockfd,"send success\n",20,0);
        if(strcmp(renewstate,"read over\n")==0)
            return 0;
        if(strcmp(renewstate,"request news\n")==0)
        {
            int n7=1;
            char renewid[20]={0};
            recv(sockfd,renewid,20,0);
            int renewsize=0;
            renewsize=strlen(myuser.id);
            char renewsys[20]={0};
            strcpy(renewsys,myuser.id);
            renewsys[renewsize-1]='\0';
            FILE *fq=fopen(renewsys,"a+");
            fwrite(&n7,4,1,fq);
            n7=20;
            fwrite(&n7,4,1,fq);
            fwrite(renewid,20,1,fq);
            fclose(fq);
        }
        if(strcmp(renewstate,"chat news\n")==0)
        {
            int renewsize;
            char renewid[20]={0};
            int renewbuff[4096]={0};
            recv(sockfd,renewid,20,0);
            recv(sockfd,&renewsize,4,0);
            recv(sockfd,renewbuff,renewsize,0);
            char renewfile[40]={0};
            strcpy(renewfile,renewid);
            int n9=strlen(renewfile);
            renewfile[n9-1]='\0';
            strcat(renewfile,myuser.id);
            n9=strlen(renewfile);
            renewfile[n9-1]='\0';
            FILE *fw=fopen(renewfile,"a+");
            fwrite(renewid,20,1,fw);
            fwrite(&renewsize,4,1,fw);
            fwrite(renewbuff,renewsize,1,fw);
            fclose(fw);
        }
    }   
    getchar(); 
}
void clearroom()
{
    int i=0;
    printf("\033[0m\033[1;1H");
    for(i=0;i<25;i++)
    {
      printf("\033[0m\033[K");
      printf("\n");
    }
    printf("kkk12adsasdfq3r12adkfaefawrawreakwr\n");
}
void chatnew()
{
    if(alarmstate!=1)
    {
        printf("\n");
    }
    else if(chat_wjb==1)
    {
        alarm(3);
    }
    else
    {
    printf("\033[0m\033[s");
    printf("\033[0m\033[1;1H");
    char chatid[20]={0};
    int sockfd=sockfd_wjb;
    strcpy(chatid,chatid_wjb);
    renew(sockfd);
    int i=0;
    printf("\033[0m\033[1;1H");
    for(i=0;i<25;i++)
    {
      printf("\033[0m\033[K");
      printf("\n");
    }
    printf("\033[0m\033[1;1H");
    printf("------chat room--------\n");
    char chatnewid[20]={0};
    strcpy(chatnewid,chatid);
    chatnewid[strlen(chatnewid)-1]='\0';
    strcat(chatnewid,myuser.id);
    chatnewid[strlen(chatnewid)-1]='\0';
    int newnum=0;
    FILE *fr=fopen(chatnewid,"a+");
    while(1)
    {
        int n8;
        char systemid[20]={0};
        n8=0;
        n8=fread(systemid,20,1,fr);
        if(n8==0)
            break;
        char chatbuff[4096]={0};
        fread(&n8,4,1,fr);
        fread(chatbuff,n8,1,fr);
        newnum++;
    }
    fclose(fr);
    fr=fopen(chatnewid,"a+");
    while(1)
    {
        int n8;
        char systemid[20]={0};
        n8=0;
        n8=fread(systemid,20,1,fr);
        if(n8==0)
            break;
        char chatbuff[4096]={0};
        fread(&n8,4,1,fr);
        fread(chatbuff,n8,1,fr);
        if(newnum>7)
        {
             newnum--;
             continue;
        }
        if(strcmp(systemid,chatid)==0)
            printf("friend:%s\n",chatbuff);
        else
            printf("me:%s\n",chatbuff);
     }
     fclose(fr);
     printf("\033[0m\033[u");
     fflush(stdout);
     if(alarmstate==1)
         alarm(2);
     }
}
int chatroom(int sockfd,char chatid[20])
{
    alarmstate=1;
    chat_wjb=0;
    char buff[4096]={0};
    system("clear");
    alarm(2);
    signal(SIGALRM,chatnew);
    while(1)
    {
        printf("\033[0m\033[30;1H");
        printf("\n-------chat %s",chatid);
        char chat[20]="i went to chat\n";
        sleep(1);
        printf("Enter news:");
        fgets(buff,4095,stdin);  //buff
        chat_wjb=1;
        send(sockfd,chat,20,0);  
        sleep(1);
        send(sockfd,chatid,20,0);
        time_t timep;  
        time(&timep);
        char sendname[4095]={0};
        strcpy(sendname,myuser.id);
        send(sockfd,chat,strlen(chat),0);
        sendname[strlen(sendname)-1]=':';
        buff[strlen(buff)-1]='\0';
        strcat(sendname,buff);
        strcpy(buff,sendname);   
        char timesend[]={"     send time:"};
        strcat(buff,timesend);
        strcat(buff,ctime(&timep));
        send(sockfd,buff,strlen(buff),0); 
        chat_wjb=0;
        char chatnewid[20]={0}; 
        strcpy(chatnewid,chatid);
        chatnewid[strlen(chatnewid)-1]='\0';
        strcat(chatnewid,myuser.id);
        chatnewid[strlen(chatnewid)-1]='\0';
        FILE *fr=fopen(chatnewid,"a+");
        fwrite(myuser.id,20,1,fr);
        int sizebuff=strlen(buff);;
        fwrite(&sizebuff,4,1,fr);
        fwrite(buff,sizebuff,1,fr);
        fclose(fr);
        while(1)
        {
            printf("1:quit\n");
            printf("2:continue chat\n");
            printf("Enter:");
            char chatstate[5]={0};
            fgets(chatstate,3,stdin);
            if(strcmp(chatstate,"1\n")==0)
            {
                alarmstate=0;
                return 0;
            }
            if(strcmp(chatstate,"2\n")==0)
                break;
        }
        system("clear");
    }
    return 0;
} 
void seefriend(int sockfd)
{
    int i;
    renew(sockfd);
    printf("-------your friend link--------\n");
    for(i=0;i<myuser.friendnum;i++)
    {
        printf("id %s\n",myuser.friend[i][0]);
        printf("name %s\n",myuser.friend[i][1]);
        int state;
        send(sockfd,"see friend\n",20,0);
        sleep(1);
        send(sockfd,myuser.friend[i][0],20,0);
        recv(sockfd,&state,4,0);
        if(state==0)
            printf("off line\n");
        if(state==1)
            printf("on line\n");
        printf("------------------------\n");
    }
    getchar();
}


结果展示:

登录窗口



菜单窗口


聊天窗口












  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值