栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

基于linux的网络聊天室系统设计(C语言)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于linux的网络聊天室系统设计(C语言)

该系统采用多线程方式实现不同主机之间的通信。

可实现多个用户间的通信以及可支持私聊模式。(输入用户名即可进入私聊模式,输入ALL返回群聊模式)

某一客户端退出并不影响其他客户的使用,所有用户全部退出,服务器关闭端口,结束进程。

服务器主线程程序框图

 服务器接收连接线程程序框图(不完全,代码后续更新了,没改框图)

  客户端主线程程序框图)

客户端消息接发线程程序框图

  实验结果

服务器端代码:

#include 
#include 
#include 
#include  
#include 
#include 
#include 
#include 
#include 
#include 
#define PORT 8080  //1023~65535
#define MAX 100
#define IP "172.17.0.6"
#define USER 20
//设置总的用户连接数
pthread_mutex_t mm;//发送数据的时候加锁,防止阻塞
typedef struct
{
    char buf[100];
}userbuf;//读写缓存
typedef struct sockaddr_in SIN; 
SIN cli_addr[USER];//
int cli_fd[USER];//客户端套接字
int tag=0;//群聊or私聊判断标志位
int count=0;//退出聊天用户数
int user=0;//实际用户数
int sockfd;
typedef struct sockaddr SA;
char siliao[20]="[PRIVATE]";//私聊信息附加显示
userbuf username[USER];//存储用户民信息
userbuf username_plus[USER];//给用户名增加冒号显示
userbuf recvbuf[USER];//服务器端接收缓存
userbuf sendbuf[USER];//服务器端发送缓
int length[USER];
int rank(char a[])
{
    int i;
    for(i=0;i 

客户端代码:

#include 
#include 
#include  
#include 
#include 
#include 
#include 
#include 
#define IP "172.17.0.6"
#define PORT 8080
#define MAX 100
int final=0;
// 创建socket套接字文件,并连接
// 接受数据  client 客户端
typedef struct sockaddr_in SIN;
typedef struct sockaddr SA;
SIN ser_addr;
int sockfd;
void *message(void *arg)
{
    printf("thread creat success!n");
    char buf[100];
    int signal;
    while(1)
    {
        if(final==1)
            break;
        memset(buf,0,100);
        signal=recv(sockfd,buf,MAX,0);
        if(signal!=0){
            system("date");
            write(1,buf,strlen(buf));
            memset(buf,0,100);}
    }
    pthread_exit(NULL);
}
int main(int argc,char *argv[])
{
    //1、创建套接字文件,返回套接字文件描述符 socket()
    sockfd=socket(AF_INET, SOCK_STREAM, 0);
    pthread_t tid;
    if(sockfd == -1)
    {
        perror("socket create failurern");
        return 0;     }

    //2、创建结构,初始化数据 struct sockaddr      使用 struct sockaddr_in
    SIN ser_addr;
    ser_addr.sin_family = AF_INET;//选择ipv4协议族  
    ser_addr.sin_port=htons(PORT);  //端口号要转换端绪,从小端绪转换从大端绪
    ser_addr.sin_addr.s_addr=inet_addr(IP);//十进制的字符ip转换成网端数据格式 服务端IP
    int len=sizeof(ser_addr);
    if(connect(sockfd,(SA *)&ser_addr,len)==-1)
    {
        perror("connect failurern");
        return 0;
    }else
    {
        printf("WELCOME TO DADONG TALK ROOM!rn");   
        printf("Please sign you name:");
        char temp[20]={0};
        memset(temp,0,100);
        scanf("%s",temp);
        send(sockfd,temp,strlen(temp),0);//发送信息
        pthread_create(&tid,NULL,message,NULL);
    }
    char wbuf[100]={0};
    while(1)
    {
        memset(wbuf,0,100);
        read(0,wbuf,100);
        if(strncmp(wbuf,"quit",4)==0)
        {
            send(sockfd,wbuf,strlen(wbuf),0);
            final=1;
            close(sockfd);
            return 0;
        }
        send(sockfd,wbuf,strlen(wbuf),MSG_NOSIGNAL);
        memset(wbuf,0,100);
        usleep(20);
    }
    close(sockfd);
    return 0;
}        

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/977389.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号