资源简介
用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
- 上一篇:鼠标脚本精灵.rar
- 下一篇:基于c++的RSA加密解密程序及源码
相关资源
- 算法与数据结构_C语言版_答案(1-8章
- 全国计算机二级c语言历年真题完整版
- AES算法的C语言版本
- 模拟 数据库 C语言 基本功能
- 基于OPENGL的C语言大作业
- 泛型链表——C语言实现
- C语言实现三种闭包算法传递,自反,
- myshell:操作系统编程-自己用C语言写
- 七参数坐标转换C语言代码
- c语言winsock 实现简单域名解析(DNS
- c语言项目五子棋对战局域网.rar
- C语言大作业西北工业大学
- C语言航空客运订票系统
- c语言实现远程控制鼠标
- linux下C语言编写的学生信息管理系统
- 300个C语言程序范例
- C语言、Python实现TF-IDF算法
- c语言 程序填空题题库
- MySQL——长途汽车管理系统c语言版,
- 基于ZigBee技术的智能灌溉系统研究与
- c语言课程设计图书信息管理系统
- 电话费查询系统(C语言文字)
- 操作系统 内存分配与回收 C语言模拟
- 使用c语言写的卷积运算程序
- ACM HDU 2000->2099 解题报告
- 学生学籍管理系统c语言实现
- 用c语言编写的一个中国象棋
- 分支定界算法C语言实现源程序
- C语言 聊天室
- STM32 LCD12864并口驱动实验 完整C语言代
评论
共有 条评论