linux聊天室单独服务器程序文档格式.docx
- 文档编号:18248788
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:8
- 大小:17.03KB
linux聊天室单独服务器程序文档格式.docx
《linux聊天室单独服务器程序文档格式.docx》由会员分享,可在线阅读,更多相关《linux聊天室单独服务器程序文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
(20)
#defineUSER_AMOUNT_MAX
(50)
#defineNOT_LOGIN
(-1)
#defineNOT_IN_USE
(NOT_LOGIN-1)
#defineUSER_ID_SIZE(ID_SIZE)
typedefstructuser{
charuser_ID[USER_ID_SIZE];
charpassword[PASSWORD_SIZE];
intclient_socket;
//client_socket==NOT_LOGIN,表示没有用户登录,
//client_socket==NOT_IN_USE,表示没有用户注册,
}user;
//多线程共享user_table
staticuseruser_table[USER_AMOUNT_MAX];
//访问user_table时要使用的信号量
pthread_mutex_tuser_table_mutex;
*函数名称:
init_user_table
*函数执行失败:
当一个报文不能容纳全部用户名称列表时,给出错误提示信息,结束程序
*依赖自定义数据结构:
structuser--本文件
*依赖全局变量:
user_table--本文件
intinit_user_table()
{
if(USER_ID_SIZE*USER_AMOUNT_MAX>
MESSAGE_SIZE)
{
printf("
USER_ID_SIZE*USER_AMOUNT_MAX>
MESSAGE_SIZE\n"
);
exit
(1);
}
inti=0;
for(i=0;
i<
user_amount_max;
i++)
user_table[i].client_socket=NOT_IN_USE;
bzero(user_table[i].user_ID,OPTION_SIZE);
bzero(user_table[i].password,OPTION_SIZE);
}
}
login
*正常返回值:
登录成功为SUCCEED,登录失败为FAIL
*参数说明:
client_socket是服务器同用户正在进行通信的socket
user_table_mutex--本文件
intlogin(char*user_ID,char*password,intclient_socket)
pthread_mutex_lock(&
user_table_mutex);
if((strcmp(user_table[i].user_ID,user_ID)==0)
&
&
(strcmp(user_table[i].password,password)==0))
user_table[i].client_socket=client_socket;
pthread_mutex_unlock(&
returnSUCCEED;
returnFAIL;
get_active_user_list
SUCCEED
在函数返回数据放置在字符数组user_list_buffer中,
在user_list_buffer中,每个用户名称占据USER_ID_SIZE+1大小.
要求user_list_buffer中的数据必须初始化为全'
\0'
intget_active_user_list(char*user_list_buffer)
if(user_table[i].client_socket>
NOT_LOGIN)
memcpy(user_list_buffer,user_table[i].user_ID,USER_ID_SIZE);
user_list_buffer+=USER_ID_SIZE+1;
user_register
注册成功SUCCEED,注册失败FAIL
注册重复的user_ID,注册失败.
如果user_table中没有处于空闲的记录,注册失败.
intuser_register(char*user_ID,char*password,intclient_socket)
if(strcmp(user_table[i].user_ID,user_ID)==0)
if(NOT_IN_USE==user_table[i].client_socket)
user_table[i].client_socket=NOT_LOGIN;
memcpy(user_table[i].user_ID,user_ID,USER_ID_SIZE);
memcpy(user_table[i].password,password,PASSWORD_SIZE);
look_up_socket
服务器与目的用户通信的socket,
没有找到服务器与目的用户通信的socket,返回值为FAIL
receiver是目的用户的ID
intlook_up_socket(char*receiver)
intsocket=0;
if(strcmp(user_table[i].user_ID,receiver)==0)
{
if(user_table[i].client_socket>
=0)
socket=user_table[i].client_socket;
returnsocket;
deactive_user
*功能说明:
用于用户登出服务器时,把服务器与用户通信的socket设置为NOT_LOGIN
没有找到服务器与用户通信的socket,返回值为FAIL
client_socket是服务器与用户通信的socket
intdeactive_user(intclient_socket)
if(user_table[i].client_socket==client_socket)
user_table[i].client_socket=NOT_LOGIN;
user_change_register
*函数功能的其他说明:
不改变当前用户的登录状态
intuser_change_register(char*user_ID,char*password,intclient_socket)
if(client_socket==user_table[i].client_socket)
init_server_socket
初始化服务器用于监听的的socket
已经初始化的服务器用于监听的的socket
输出错误信息,退出程序
intinit_server_socket()
structsockaddr_inserver_addr;
bzero(&
server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htons(INADDR_ANY);
server_addr.sin_port=htons(CHAT_SERVER_PORT);
intserver_socket=socket(AF_INET,SOCK_STREAM,0);
if(server_socket<
0)
CreateSocketFailed!
"
if(bind(server_socket,(structsockaddr*)&
server_addr,sizeof(server_addr)))
ServerBindPort:
%dFailed!
CHAT_SERVER_PORT);
if(listen(server_socket,LENGTH_OF_LISTEN_QUEUE))
ServerListenFailed!
returnserver_socket;
process_request
根据接收到的报文的内容,进行响应的服务.
服务类型包括:
注册,登录,获取已登录用户列表,向用户发送信息,退出,修改注册信息
服务器对用户发回的响应类型
没有检测和处理
receive_buffer为服务器收到的报文的内容
chat_package--chat.h
intprocess_request(intclient_socket,char*receive_buffer)
chat_packagesend_buffer;
bzero((char*)&
send_buffer,BUFFER_SIZE);
char*user_ID=((chat_package*)receive_buffer)->
from;
char*password=((chat_package*)receive_buffer)->
password;
char*receiver=((chat_package*)receive_buffer)->
to;
Request%dfromclient\n"
((chat_package*)receive_buffer)->
type);
switch(((chat_package*)receive_buffer)->
type)
caseREGISTER:
send_buffer.type=user_register(user_ID,password,client_socket);
break;
caseLOGIN:
send_buffer.type=login(user_ID,password,client_socket);
caseGET_USER_LIST:
memcpy(send_buffer.option,USER_LIST,OPTION_SIZE);
send_buffer.type=get_active_user_list(send_buffer.message);
caseTALK_TO:
send_buffer.type=SUCCEED;
send(client_socket,(chat_package*)&
send_buffer,BUFFER_SIZE,0);
client_socket=look_up_socket(receiver);
send_buffer.type=TRANSFER;
memcpy(send_buffer.from,((chat_package*)receive_buffer)->
fro
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 聊天室 单独 服务器 程序