• 大小: 278KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-03
  • 语言: C/C++
  • 标签: 基于Linux  多线程  

资源简介

用C语言编程实现linux简单的聊天室功能。   用户程序命名为client.c;服务器程序命名为server.c   绑定端口等信息见实验方法内容;   要求client可以通过socket连接server   在client,提示输入服务器ip   若连接server 的socket建立成功,返回提示信息   Client输入的聊天内容在client端(多个client端)和server端同时显示;   多个client可同时接入server,进入聊天室,最多支持20个client;   Client端输入quit退出连接,server端提示client退出。   可选择使用多线程实现多客户端;

资源截图

代码片段和文件信息

/******* 服务器程序(server.c) ************/

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

//#include 
typedef unsigned long int pthread_t;




#define MAXLINE 1000//在一条消息中最大的输出字符数

#define LISTENQ 20//最大监听队列

#define PORT 5000//监听端口

#define MAXFD 20//最大的在线用户数量

void *get_client(void *);

int  sockfdi;

static int  maxi=0;//maxi表示当前client数组中最大的用户的i值

static int  client[MAXFD];

void recvandsend(void)//监听转发线程入口函数

{

int  index=0;

int  nbytes=0;

char buffer[1024];

 int  len;

 int outindex=0;

 while(1)

 {

if(maxi>0)

{

  memset(buffer0sizeof(buffer));

  nbytes=0;   

  //index++; 

  nbytes=read(client[index++]buffersizeof(buffer));

//  printf(“%d%d\n“indexclient[index]); 

  if(nbytes>0)
  {

   buffer[nbytes]=‘\0‘;

   printf(“%s\n“buffer);

   outindex=0;

   while(outindex {
     if(write(client[outindex++]buffersizeof(buffer))==-1)
     {
      fprintf(stderr“WriteError:%s\n“strerror(errno));
      exit(1);
     }
}
  }

 }

 if(index>=maxi)
index=0;
 }
 pthread_exit(NULL);

}

 

int  main(int  argc char  *argv[])
{

//  int client_fd[LISTENQ]clientnum=0;;

 struct sockaddr_in server_addr;

 struct sockaddr_in client_addr;

 int sin_sizeportnumber;

 char hello[]=“Hello! Are You Fine?\n“;

 int   thr_id;  /* thread ID for the newly createdthread */

 pthread_t  p_thread; /* thread‘s struct ure  */

 int  new_fd=0;

 memset(client0sizeof(client));

 if(argc!=1)
 {

 fprintf(stderr“Usage:%sportnumber\a\n“argv[0]);

 exit(1);

 }

 

 /* 服务器端开始建立 socket 描述符 */

 if((sockfd=socket(AF_INETSOCK_STREAM0))==-1)

 {

 fprintf(stderr“Socketerror:%s\n\a“strerror(errno));

 exit(1);

 }

 /* 服务器端填充 sockaddr 结构 */

 bzero(&server_addrsizeof(struct sockaddr_in));

 server_addr.sin_family=AF_INET;

 server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

 server_addr.sin_port=htons(PORT);

 /* 捆绑 sockfd 描述符 */

 if(bind(sockfd(struct sockaddr *)(&server_addr)sizeof(struct  sockaddr))==-1)

 {

 fprintf(stderr“Binderror:%s\n\a“strerror(errno));

 exit(1);

 }

 printf(“服务器监听端口%d...\n“PORT);

 /* 监听 sockfd 描述符 */

 if(listen(sockfdLISTENQ)==-1)

 {

 fprintf(stderr“Listenerror:%s\n\a“strerror(errno));

 exit(1);

 }

 thr_id =pthread_create(&p_thread NULL recvandsend NULL);

 printf(“欢迎来到本聊天室\n“);

 while(1)

 {

 /* 服务器阻塞直到客户程序建立连接 */

 if(maxi>=20)

 {

  printf(“以达到人数上线\n“);

  continue;

 }

 sin_size=sizeof(struct sockaddr_in);

 if((new_fd=accept(sockfd(struct sockaddr *)(&client_addr)&sin_size))==-1)

 {

  fprintf(stderr“Accepterror:%s\n\a“strerror(errno));

  exit(1);

 }

 /*fprintf(stderr“Serverget connection from %s\n“inet_ntoa(client_addr.sin_a

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2020-05-07 21:37  LTS\
     目录           0  2020-05-07 21:36  LTS\fwq\
     文件          79  2020-05-07 21:36  LTS\fwq\Makefile
     文件        3389  2020-05-07 21:36  LTS\fwq\server.c
     文件       13472  2020-05-07 21:36  LTS\fwq\weserver
     目录           0  2020-05-07 21:36  LTS\khd\
     文件        2587  2020-05-07 21:36  LTS\khd\client.c
     文件          78  2020-05-07 21:36  LTS\khd\Makefile
     文件       13512  2020-05-07 21:36  LTS\khd\weclient
     文件      295453  2020-05-07 21:33  LTS\聊天室大作业.docx

评论

共有 条评论