利用select实现一个聊天室程序

该博客介绍了一个利用socket编程实现的聊天室程序。实验要求用户在广播模式下交流,支持帮助、退出、查看在线用户及点对点消息等功能。在Red Hat 9环境下,通过chatserver.c和chatclient.c代码实现。博客展示了运行结果,包括消息发送、接收以及用户加入、退出的管理。
实验要求
  1. 用户默认处于广播模式,一个客户在其客户端发送的消息,其它客户端用户全部可以收到;
  2. 程序支持下列命令
    /help:显示帮助信息(思考:信息是放在客户端还是服务器端);
    /quit:用户退出聊天室,同时将退出信息广播给其他用户;
    /who:显示在线用户;
    /send 用户名 消息:向指定用户发送点到点消息
  3. 程序退出时清理所有的占用资源,包括内存资源、套接字等
  4. 支持最大连接数限制;
  5. 能够管理用户加入和退出。
实验环境

Red Hat 9

代码
chatserver.c
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<sys/socket.h>  
#include<netdb.h>  
#include<sys/time.h>  
#include<sys/types.h>  
  
#define PORT 1573  
#define BACKLOG 10  
#define BUFSIZE 2048  
    
struct client_info{
   
     
    int id;        //Represents the socket the user is now accessing 
    char name[256];  
    int first;     //whether the user is visiting for the first time and is used to pass in the name
};  
  
int main(){
   
     
    fd_set allset;   //All sockets that need to be scanned
    fd_set rset;     //Socket after select  
    struct sockaddr_in server;  
    struct sockaddr_in client;  
    int maxfd;  
    int sockfd;  
    int confd;  
    char recvbuf[BUFSIZE];  
    char sendbuf[BUFSIZE];  
    int recvnum;  
    int sendnum;  
    int opt;         //Define socket properties  
    int length;      
  
    opt = SO_REUSEADDR;  
    length = sizeof(struct sockaddr);  
  
    int tmp_i;  
    int tmp_j;  
    char str1[256];  
    char str2[256];  
    char str3[256];  
    int tmpid=-1;   
    int tmpfd=-1;    
    struct client_info clientinfo[BACKLOG];  
  
    
    FD_ZERO(&allset);  
    FD_ZERO(&rset);  
  
    if(-1 == (sockfd=socket(AF_INET,SOCK_STREAM,0)))  
    {
   
     
        perror("create socket error!\n");  
        exit(1);  
    }  
  
    setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));  
  
    memset(&server,0,sizeof(server));  
    memset(sendbuf,0,BUFSIZE);  
    memset(recvbuf,0,BUFSIZE);  
    int i;  
      
    for(i=0;i<BACKLOG;i++)  
    {
   
     
        clientinfo[i].id = -1;  
        clientinfo[i].name[0] = '\0';  
        clientinfo[i].first = -1;  
    }  
    server.sin_family = AF_INET;  
    server.sin_addr.s_addr = htonl(INADDR_ANY);  
    server.sin_port = htons(PORT);  
  
    if(-1 == bind(sockfd,(struct sockaddr*)&server,sizeof(struct sockaddr)))  
    {
   
     
        perror("bind socket error!\n");  
        exit(1);  
    }  
  
    if(
项目简介: 采用I/O复用技术select实现socket通信,采用多线程负责每个客户操作处理,完成Linux下的多客户聊天室! OS:Ubuntu 15.04 IDE:vim gcc make DB:Sqlite 3 Time:2015-12-09 ~ 2012-12-21 项目功能架构: 1. 采用client/server结构; 2. 给出客户操作主界面(注册、登录、帮助和退出)、登录后主界面(查看在线列表、私聊、群聊、查看聊天记录、退出); 3. 多客户可同时连接服务器进行自己操作; ##服务器端## 1. server.c:服务器端主程序代码文件; 2. config.h:服务器端配置文件(包含需要的头文件、常量、数据结构及函数声明); 3. config.c:服务器端公共函数的实现文件; 4. list.c:链表实现文件,用于维护在线用户链表的添加、更新、删除操作; 5. register.c:服务器端实现用户注册; 6. login.c:服务器端实现用户登录; 7. chat.c:服务器端实现用户的聊天互动操作; 8. Makefile:服务器端make文件,控制台执行make命令可直接生成可执行文件server ##客户端## 1. client.c:客户端主程序代码文件; 2. config.h:客户端配置文件(包含需要的头文件、常量、数据结构及函数声明); 3. config.c:客户端公共函数的实现文件; 4. register.c:客户端实现用户注册; 5. login.c:客户端实现用户登录; 6. chat.c:客户端实现用户的聊天互动操作; 7. Makefile:客户端make文件,控制台执行make命令可直接生成可执行文件client;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值