基于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 *正常返回值 :。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。