资源简介

基于linux的socket多线程通信方式。采用sqlite3数据库存储用户信息. 能够实现注册、登陆、退出 私聊、群聊、修改密码、查看在线用户........

资源截图

代码片段和文件信息

/*************************linux多人聊天室*********************************
 *实现方式:基于linux的socket多线程通信方式。采用sqlite3数据库存储用户信息
 *作者:    曹丹(Cao Dan)@cqupt
 *完成时间: 2013/01/19
 ************************************************************************* 
 * */
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include “display.h“
#include “chatroom_lib.h“

#define PORT_NUM 8765
#define BUFF_SIZE 1024
#define PASSWD_LEN 30
#define USERNAME_LEN 30

void action_log(void);  //登录服务器
int action_log_in(void);
void action_register(void);
void *pthread_read(void *arg);
void sigint_handler(int signo);
void sigpipe_handler(int signo);
void reset_passwd(void);

int sockfd;  //套接字描述符
char buffer_rcv[BUFF_SIZE] buffer_send[BUFF_SIZE]; //接收和发送缓存区

int main(int argc char *argv[])
{
int res choice;

if(argc != 2) {
fprintf(stderr “Usage: %s server_ip\n“ argv[0]);
exit(EXIT_FAILURE);
}
signal(SIGINT sigint_handler);
signal(SIGPIPE sigpipe_handler);

if ( confirm_socket_client(&sockfd argv[1] PORT_NUM) == -1)
exit(EXIT_FAILURE);

while(1) {
display_main_menu();
puts(“Enter your choice:“);
scanf(“%d“&choice);
getchar();
switch(choice) {
case 1:   //log
action_log();
if(action_log_in() == -1) {
close(sockfd);
return 0;
}
break;
case 2:    //register
action_register();
break;
case 3:  
return 0; /*log out*/
default:
puts(“invalid input please enter again“);
break;
} /*end of switch choice */
} /*end of while(1)*/

return 0;
} /*end of main*/

/*signal function*/
void sigint_handler(int signo)
{
close(sockfd);
puts(“\ncaught signal SIGINT.“);
puts(“socket has been closed“);
//signal(SIGINT SIG_DFL);
exit(EXIT_SUCCESS);
}

void sigpipe_handler(int signo)
{
puts(“\ncaught signal SIGPIPE.“);
puts(“error occuredconnection may have been closed by server“);
exit(EXIT_FAILURE);
}

void action_log(void)
{
char username[USERNAME_LEN] passwd[PASSWD_LEN];
/*pormat is u:username:passwd:1*/

//respons from server
do {
puts(“Enter your username“);
scanf(“%s“username);  //get username
getchar();
puts(“Enter your passwd“);
scanf(“%s“passwd);    //get passwd
getchar();
sprintf(buffer_send “u:%s:%s:1\0“ username passwd);
write(sockfd buffer_send strlen(buffer_send)); 
read(sockfd buffer_rcv BUFF_SIZE);
puts(buffer_rcv);
}while( strncmp(buffer_rcv “OK“ 2) != 0 );

}

int action_log_in(void)
{
pthread_t thread_id;
void *thread_ret;
int n;

display_log_in_menu();
//创建线程读取服务器数据
if(pthread_create(&thread_id NULL pthread_readNULL)!=0){
perror(“pthread_create“);
exit(EXIT_FAILURE);
}
while(1) {
bzero(buffer_rcv BUFF_SIZE);  
bzero(buffer_send BUFF_SIZE);
get_input_option(buffer_rcv);  //获取输入选项
switch(buffer_rcv[0]) {
case ‘/‘:
case ‘-‘:
strcpy(buffer_send buffer_rcv);
write(sockfd buffer_send BUFF_SIZE);
break;
case ‘.‘:
if(!strncmp(buffer_rcv

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2013-01-19 16:07  Chatroom\
     文件       18161  2013-01-19 16:03  Chatroom\chatroom_client
     文件        5211  2013-01-19 15:49  Chatroom\chatroom_client.c
     文件        5644  2013-01-19 16:03  Chatroom\chatroom_client.o
     文件        8387  2013-01-19 15:53  Chatroom\chatroom_lib.c
     文件        1078  2013-01-18 10:30  Chatroom\chatroom_lib.h
     文件        7240  2013-01-19 16:03  Chatroom\chatroom_lib.o
     文件       22411  2013-01-19 16:03  Chatroom\chatroom_server
     文件        8251  2013-01-19 15:51  Chatroom\chatroom_server.c
     文件        7768  2013-01-19 16:03  Chatroom\chatroom_server.o
     文件        1603  2013-01-19 15:52  Chatroom\display.c
     文件         162  2013-01-11 13:56  Chatroom\display.h
     文件        2116  2013-01-19 16:03  Chatroom\display.o
     文件      115764  2013-01-19 16:07  Chatroom\linux多人聊天室项目总结.docx.pdf
     文件         519  2013-01-19 16:03  Chatroom\Makefile
     文件        4969  2013-01-17 21:05  Chatroom\tags
     文件        3072  2013-01-18 10:55  Chatroom\user_database.db

评论

共有 条评论