基于socket的聊天系统设计内容摘要:
设计 10 return SUCCEED。 } } pthread_mutex_unlock(amp。 user_table_mutex)。 return FAIL。 } /************************************************************ *函数名称 : init_server_socket *功能说明 : 初始化服务器用于监听的的 socket *正常返回值 : 已经初始化的服务器用于监听的的 socket *函数执行失败 : 输出错误信息 ,退出程序 *************************************************************/ int init_server_socket() { struct sockaddr_in server_addr。 bzero(amp。 server_addr,sizeof(server_addr))。 = AF_INET。 = htons(INADDR_ANY)。 = htons(CHAT_SERVER_PORT)。 int server_socket = socket(AF_INET,SOCK_STREAM,0)。 if( server_socket 0) { printf(Create Socket Failed!)。 exit(1)。 } if( bind(server_socket,(struct sockaddr*)amp。 server_addr,sizeof(server_addr))) { printf(Server Bind Port : %d Failed!, CHAT_SERVER_PORT)。 exit(1)。 } if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) ) { printf(Server Listen Failed!)。 exit(1)。 《网络编程》课程设计 11 } return server_socket。 } /************************************************************ *函数名称 : process_request *功能说明 : 根据接收到的报文的内容 ,进行响应的服务 . * 服务类型包括 :注册 ,登录 ,获取已登录用户列表 ,向用户发送信息 ,退出 ,修改注册信息 *正常返回值 : 服务器对用户发回的响应类型 *函数执行失败 : 没有检测和处理 *参数说明 : client_socket 是服务器与用户通信的 socket * receive_buffer 为服务器收到的报文的内容 *依赖自定义数据结构 : chat_package *************************************************************/ int process_request(int client_socket, char * receive_buffer) { chat_package send_buffer。 bzero((char*)amp。 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。 printf(Request %d from client\n,((chat_package *)receive_buffer)type)。 switch(((chat_package *)receive_buffer)type) { case REGISTER: = user_register(user_ID, password, client_socket)。 break。 case LOGIN: = login(user_ID, password, client_socket)。 break。 case GET_USER_LIST: memcpy(, USER_LIST, OPTION_SIZE)。 = get_active_user_list()。 break。 case TALK_TO: = SUCCEED。 send(client_socket, (chat_package *)amp。 send_buffer,BUFFER_SIZE,0)。 《网络编程》课程设计 12 client_socket = look_up_socket(receiver)。 = TRANSFER。 memcpy(, ((chat_package *)receive_buffer)from, MESSAGE_SIZE)。 memcpy(, ((chat_package *)receive_buffer)message, MESSAGE_SIZE)。 break。 case EXIT: deactive_user(client_socket)。 return。 break。 case CHANGE: = user_change_register(user_ID, password, client_socket)。 } printf(Answer %d to client\n,)。 send(client_socket, (chat_package *)amp。 send_buffer,BUFFER_SIZE,0)。 return。 } /************************************************************ *函数名称 : talk_to_client *功能说明 : 对单独的一个用户的各种请求进行服务 ,当用户的请求 为 EXIT时 ,结束本线程 *函数执行失败 : 通信失败时 ,显示错误信息 ,结束本线程 *依赖自定义数据结构 : chat_package *************************************************************/ void * talk_to_client(void * new_server_socket_to_client) { int new_server_socket = (int)new_server_socket_to_client。 int request = NO_COMMAND。 while(request!=EXIT) { chat_package buffer。 bzero((char*)amp。 buffer,BUFFER_SIZE)。 int length = recv(new_server_socket,(char*)amp。 buffer,BUFFER_SIZE,0)。 if (length 0) 《网络编程》课程设计 13 { printf(Server Recieve Data Failed!\n)。 close(new_server_socket)。 pthread_exit(NULL)。 } if (length==0) { close(new_server_socket)。 pthread_exit(NULL)。 } request = process_request(new_server_socket, (char*)amp。 buffer)。 } close(new_server_socket)。 pthread_exit(NULL)。 } int main(int argc, char **argv) { init_user_table()。 pthread_mutex_init(amp。 user_table_mutex, NULL)。 int server_socket = init_server_socket()。 pthread_t child_thread。 pthread_attr_t child_thread_attr。 pthread_attr_init(amp。 child_thread_attr)。 pthread_attr_setdetachstate(amp。 child_thread_attr,PTHREAD_CREATE_DETACHED)。 while (1) { struct sockaddr_in client_addr。 socklen_t length = sizeof(client_addr)。 int new_server_socket = accept(server_socket,(struct sockaddr*)amp。 client_addr,amp。 length)。 if ( new_server_socket 0) { printf(Server Accept Failed!\n)。 《网络编程》课程设计 14 break。 } if( pthread_create(amp。 child_thread,amp。 child_thread_attr,talk_to_client, (void *)new_server_socket) 0 ) printf(pthread_create Failed : %s\n,strerror(errno))。 } close(server_socket)。 pthread_attr_destroy(amp。 child_thread_attr)。 pthread_mutex_destroy(amp。 user_table_mutex)。 pthread_exit (NULL)。 return 0。 } 客户端 /************************************************************ * 基于 socket 的聊天客户机 *设计思路 : * 客户机提出各种请求 ,服务器根据不同请求 ,发送不同的响应 . *关键问题 : * 客户机和 服务器之间协议制订 *************************************************************/ include include // for fork include sys/ // for signal include sys/ // for wait include static char user_ID[BUFFER_SIZE]。 //一个很大的缓冲区 ,实际 ID_SIZE内有效 static char password[BUFFER_SIZE]。 // 一个很大的缓冲区 , 实际PASSWORD_SIZEE 内有效 static int client_socket。 /************************************************************ *函数名称 : connect_to_server *正常返回值 :。基于socket的聊天系统设计
相关推荐
反复使用。 穿孔带容纳的程序长度可不受限制,但如果发生错误时就要全部更换。 穿孔卡的信息容量有限,但便于更换、保存、可重复使用。 磁芯和磁鼓仅适用子存贮容量较大的场合。 范于选择那一种控制 元件,则根据动作的复杂程度和精确程度来确定。 分类 按用途分类 ( 1) 专用机械手 专用机械手是专为一定设备服务的,简单、实用,目前在生产中运用比较广泛。 它一般只能完成一、二种特定的作业
图 ER 图 系统用例图 留言板用例图 第 8 页 共 34 页 图 系统用例图 系统总体设计 系统有三种身份登录:管理员、用户、访问者。 管理员只有一个,是程序中自己设定的,为了保证系统安全,用户不可以自己升级为管理员可以进入自己的后台修改信息,访问者可以访问留言板的任何内容,但要想发布内容,就要进行注册以认清用 户身份。 留言板系统采用 MVC 模式( model、 view、
构后的 ACL模型,解决系统用户权限继承角色权限,以及权限排斥的问题。 权限管理实现授权登陆用户能够添加模块信息、删除模块信息 ,添加角色、删除角色、给角色授权,给用户分配帐号、删除帐号、修改帐号信息,给用户分配角色、给特权用户授权、查看用户信息,普通登陆用户能够查看模块信息、角色信息 、修改用户密码。 本系统采用了分层开发,但是对三层架构做了修改,将持久层合并在业务逻辑层中,系统分为呈现层
计人员经验为基础,借助一定的计算方法和计算工具,以寻求布局方案较优解。 该方法的典型代表是 Muther提出的 SLP(SystematicLayoutPlanning)法。 SLP是将研究工厂布局问题的依据和切入点归纳为五个基本要素:产品、产量、生产路线、辅助部门和时间。 前二个基本要素是一切其他特征或条件的基础。 在上述各要素充分调查研究并取得全面、准确的各项原始数据的基础上
图 4 电梯二层外呼向下允许标志 Fig. 4 Sign of elevator is allowed to go down the second floor 105 图 5 电梯二层外呼下指示灯 Fig. 5 Display of elevator is allowed to go down the second floor 4 中国 科技论文在线 110 115 120 125 130
速 8 P0700 1 内控 1,外空 2 模式选择 9 P1000 1 内控 1,外空 2 模式选择 10 P1080 0 最小频率 11 P1082 50 最大频率 12 P1120 10 斜坡上升时间 13 P1121 10 斜坡下降时间 14 P3900 1 结束 快速调试 电机类型修改为异步电机步骤 步骤 参数名 设定值 参数说明 备注 1 P0010 1 进入快速调 试 2