#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <fcntl.h>
#include <sys/stat.h>
/*Internet*/
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/un.h>
#include <netinet/in.h>
/*Pthread*/
#include <pthread.h>
#define PORT 8888
#define ERR(m)\
do{\
perror(m);\
exit(EXIT_FAILURE);\
}while(0)
struct online{
int clientfd;
char name[20];
char password[20];
struct online *next;
};
struct message{
int action;
char name[20];
char password[10];
char toname[20];
char msg[1024];
};
enum action{
REGIN = 1,
REGSUC,
REGFAIL,
LOGIN,
LOGSUC,
LOGFAIL,
FINDNAME,
FINDSUC,
FINDFAIL,
CHATOUT,
CHATIN,
SENDALL,
NOOTHER,
DISALL,
DISALLSUC,
};
typedef struct online Online;
typedef struct online * Link;
void create_link(Link *head);
void create_newnode(Link *newnode);
void is_malloc_ok(Link *newnode);
void insert_node(Link newnode);
void * read_msg(void *arg);
int is_login(struct message msg);
int findname(struct message msg);
void chat(struct message msg);
void sendall(struct message msg);
void displayall(struct message msg);
//void file_read(void );
Link head;
int main()
{
int listenfd;
int sockfd;
pthread_t pid;
head = (Link)malloc(sizeof(Online));
head->next = head;
//file_read();
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
socklen_t serverlen = sizeof(struct sockaddr_in);
socklen_t clientlen = sizeof(struct sockaddr_in);
if((listenfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
ERR("------socket error:");
else
printf("------socket successfully !\n");
//bzero(&server_addr,sizeof(struct sockaddr_in));
memset(&server_addr,0,sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr =htonl(INADDR_ANY);
int opt = 1;
if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)) < 0)
ERR("------setsockopt error:");
else
printf("------setsockopt successfully !\n");
if(bind(listenfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr_in)) < 0)
ERR("------bind error:");
else
printf("------bind successfully !\n");
if(listen(listenfd,SOMAXCONN) < 0)
ERR("------listen error:");
else
printf("------listen successfully !\n");
while(1)
{
if((sockfd = accept(listenfd,(struct sockaddr*)&client_addr,&clientlen)) < 0)
ERR("------accept error:");
else
printf("------accept successfully!\n");
printf("********IP : %s --- PORT : %d ------ ONLINE\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
pthread_create(&pid,NULL,read_msg,(void *)sockfd);
}
return 0;
}
/*
void file_read(void )
{
Link temp;
FILE *fp;
temp = head->next;
if((fp = fopen("liaotianshi.txt","w")) == NULL)
ERR("open file error:");
fseek(fp,0,SEEK_SET);
create_newnode(&new_node);
fread(newnode,sizeof(Online),1,fp);
insert_node(new_node);
while(!feof(fp))
{
create_newnode(&new_node);
fread(newnode,sizeof(Online),1,fp);
insert_node(new_node);
}
while(temp != head)
{
printf("++++++++++++++++++++++++++++++++++++%s\n",temp->name);
temp = temp->next;
}
temp = head->next;
fclose(fp);
}
*/
void create_link(Link *head)
{
create_newnode(head);
(*head)->next = (*head);
}
void create_newnode(Link *newnode)
{
(*newnode) = (Link)malloc(sizeof(Online));
is_malloc_ok(newnode);
}
void is_malloc_ok(Link *newnode)
{
if(*newnode == NULL)
ERR("------malloc error:");
}
void insert_node(Link newnode)
{
newnode->next = head->next;
head->next = newnode;
}
void * read_msg(void *arg)
{
int sockfd = (int)arg;
Link new_node;
int n_read;
struct message msg;
memset(&msg,0,sizeof(struct message));
while(1)
{
memset(&msg,0,sizeof(struct message));
n_read = recv(sockfd,&msg,sizeof(struct message),0);
if(n_read <= 0)
{
printf("------client quit %d!\n",n_read);
break;
}
printf("++++++++++++++++++++++++++++++++++++++++%s %s\n",msg.name,msg.toname);
switch(msg.action)
{
case REGIN:{
create_newnode(&new_node);
new_node->clientfd = sockfd;
strcpy(new_node->name,msg.name);
strcpy(new_node->password,msg.password);
insert_node(new_node);
msg.action = REGSUC;
send(sockfd,&msg,sizeof(struct message),0);
printf("------already register %d\n",new_node->clientfd);
break;
}
case LOGIN:{
if(is_login(msg))
{
msg.action = LOGSUC;
send(sockfd,&msg,sizeof(struct message),0);
printf("------already login\n");
break;
}
else
{
msg.action = LOGFAIL;
send(sockfd,&msg,sizeof(struct message),0);
printf("------there is no this people\n");
break;
}
}
case FINDNAME:{
if(findname(msg))
{
msg.action = FINDSUC;
send(sockfd,&msg,sizeof(struct message),0);
printf("------find successfully !\n");
break;
}
else
{
msg.action = FINDFAIL;
send(sockfd,&msg,sizeof(struct message),0);
printf("------find failure !\n");
break;
}
}
case CHATOUT:{
printf("(((((((((%s)))))))))\n",msg.toname);
chat(msg);
printf("1111111111111111\n");
break;
}
case SENDALL:sendall(msg);break;
case DISALL:displayall(msg);break;
default:break;
}
}
}
void displayall(struct message msg)
{
Link temp;
temp = head->next;
int tofd;
if(temp->next == head)
{
if(strcmp(msg.name,temp->name) == 0)
{
tofd = temp->clientfd;
}
}
else
{
while(temp != head)
{
if(strcmp(temp->name,msg.name) == 0)
{
tofd = temp->clientfd;
break;
}
temp = temp->next;
}
}
temp = head->next;
if(temp->next == head)
{
msg.action = DISALLSUC;
strcpy(msg.toname,temp->name);
send(tofd,&msg,sizeof(struct message),0);
}
else
{
while(temp != head)
{
msg.action = DISALLSUC;
strcpy(msg.toname,temp->name);
send(tofd,&msg,sizeof(struct message),0);
sleep(1);
temp = temp->next;
}
}
}
void sendall(struct message msg)
{
Link temp;
temp = head->next;
int tofd;
if(temp->next == head)
{
if(strcmp(msg.name,temp->name) == 0)
{
msg.action = NOOTHER;
tofd = temp->clientfd;
send(tofd,&msg,sizeof(struct message),0);
}
}
else
{
while(temp != head)
{
if(strcmp(temp->name,msg.name) != 0)
{
msg.action = CHATIN;
tofd = temp->clientfd;
send(tofd,&msg,sizeof(struct message),0);
}
temp = temp->next;
}
}
}
void chat(struct message msg)
{
Link temp;
int tofd;
temp = head->next;
while(temp != head)
{
printf("++++++++++++++++++++++++++++++++++++%s\n",temp->name);
temp = temp->next;
}
temp = head->next;
if(temp->next == head)
{
if(strcmp(temp->name,msg.toname) == 0)
{
//printf("22222222222222222222\n");
tofd = temp->clientfd;
msg.action = CHATIN;
send(tofd,&msg,sizeof(struct message),0);
//printf("33333333333333333333333\n");
}
}
else
{
//printf("((((((((((((((((((((()))))))))))))))))))))");
while(temp != head)
{
// printf("%s\n",msg.toname);
if(strcmp(temp->name,msg.toname) == 0)
{
//printf("444444444444444444\n");
tofd = temp->clientfd;
msg.action = CHATIN;
printf("++++++++++++++++++++++++++++++++++++++++++++++%s\n",temp->name);
send(tofd,&msg,sizeof(struct message),0);
//printf("555555555555555555\n");
}
temp = temp->next;
}
}
}
int findname(struct message msg)
{
Link temp;
int flag = 0;
temp = head->next;
if(temp->next == head)
{
if(strcmp(temp->name,msg.toname) == 0)
flag = 1;
}
else
{
while(temp != head)
{
if(strcmp(temp->name,msg.toname) == 0)
{
flag = 1;
break;
}
temp = temp->next;
}
}
return flag;
}
int is_login(struct message msg)
{
int flag = 0;
Link temp;
temp = head->next;
if(temp->next == head)
{
if(strcmp(msg.name,temp->name) == 0)
{
if(strcmp(msg.password,temp->password) == 0)
flag = 1;
}
}
else
{
while(temp->next != head)
{
if(strcmp(msg.name,temp->name) == 0)
{
if(strcmp(msg.password,temp->password) == 0)
{
flag = 1;
break;
}
}
temp = temp->next;
}
}
return flag;
}
#include <stdlib.h>
#include <error.h>
#include <fcntl.h>
#include <sys/stat.h>
/*Internet*/
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/un.h>
#include <netinet/in.h>
/*Pthread*/
#include <pthread.h>
#define PORT 8888
#define ERR(m)\
do{\
perror(m);\
exit(EXIT_FAILURE);\
}while(0)
struct online{
int clientfd;
char name[20];
char password[20];
struct online *next;
};
struct message{
int action;
char name[20];
char password[10];
char toname[20];
char msg[1024];
};
enum action{
REGIN = 1,
REGSUC,
REGFAIL,
LOGIN,
LOGSUC,
LOGFAIL,
FINDNAME,
FINDSUC,
FINDFAIL,
CHATOUT,
CHATIN,
SENDALL,
NOOTHER,
DISALL,
DISALLSUC,
};
typedef struct online Online;
typedef struct online * Link;
void create_link(Link *head);
void create_newnode(Link *newnode);
void is_malloc_ok(Link *newnode);
void insert_node(Link newnode);
void * read_msg(void *arg);
int is_login(struct message msg);
int findname(struct message msg);
void chat(struct message msg);
void sendall(struct message msg);
void displayall(struct message msg);
//void file_read(void );
Link head;
int main()
{
int listenfd;
int sockfd;
pthread_t pid;
head = (Link)malloc(sizeof(Online));
head->next = head;
//file_read();
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
socklen_t serverlen = sizeof(struct sockaddr_in);
socklen_t clientlen = sizeof(struct sockaddr_in);
if((listenfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
ERR("------socket error:");
else
printf("------socket successfully !\n");
//bzero(&server_addr,sizeof(struct sockaddr_in));
memset(&server_addr,0,sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr =htonl(INADDR_ANY);
int opt = 1;
if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)) < 0)
ERR("------setsockopt error:");
else
printf("------setsockopt successfully !\n");
if(bind(listenfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr_in)) < 0)
ERR("------bind error:");
else
printf("------bind successfully !\n");
if(listen(listenfd,SOMAXCONN) < 0)
ERR("------listen error:");
else
printf("------listen successfully !\n");
while(1)
{
if((sockfd = accept(listenfd,(struct sockaddr*)&client_addr,&clientlen)) < 0)
ERR("------accept error:");
else
printf("------accept successfully!\n");
printf("********IP : %s --- PORT : %d ------ ONLINE\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
pthread_create(&pid,NULL,read_msg,(void *)sockfd);
}
return 0;
}
/*
void file_read(void )
{
Link temp;
FILE *fp;
temp = head->next;
if((fp = fopen("liaotianshi.txt","w")) == NULL)
ERR("open file error:");
fseek(fp,0,SEEK_SET);
create_newnode(&new_node);
fread(newnode,sizeof(Online),1,fp);
insert_node(new_node);
while(!feof(fp))
{
create_newnode(&new_node);
fread(newnode,sizeof(Online),1,fp);
insert_node(new_node);
}
while(temp != head)
{
printf("++++++++++++++++++++++++++++++++++++%s\n",temp->name);
temp = temp->next;
}
temp = head->next;
fclose(fp);
}
*/
void create_link(Link *head)
{
create_newnode(head);
(*head)->next = (*head);
}
void create_newnode(Link *newnode)
{
(*newnode) = (Link)malloc(sizeof(Online));
is_malloc_ok(newnode);
}
void is_malloc_ok(Link *newnode)
{
if(*newnode == NULL)
ERR("------malloc error:");
}
void insert_node(Link newnode)
{
newnode->next = head->next;
head->next = newnode;
}
void * read_msg(void *arg)
{
int sockfd = (int)arg;
Link new_node;
int n_read;
struct message msg;
memset(&msg,0,sizeof(struct message));
while(1)
{
memset(&msg,0,sizeof(struct message));
n_read = recv(sockfd,&msg,sizeof(struct message),0);
if(n_read <= 0)
{
printf("------client quit %d!\n",n_read);
break;
}
printf("++++++++++++++++++++++++++++++++++++++++%s %s\n",msg.name,msg.toname);
switch(msg.action)
{
case REGIN:{
create_newnode(&new_node);
new_node->clientfd = sockfd;
strcpy(new_node->name,msg.name);
strcpy(new_node->password,msg.password);
insert_node(new_node);
msg.action = REGSUC;
send(sockfd,&msg,sizeof(struct message),0);
printf("------already register %d\n",new_node->clientfd);
break;
}
case LOGIN:{
if(is_login(msg))
{
msg.action = LOGSUC;
send(sockfd,&msg,sizeof(struct message),0);
printf("------already login\n");
break;
}
else
{
msg.action = LOGFAIL;
send(sockfd,&msg,sizeof(struct message),0);
printf("------there is no this people\n");
break;
}
}
case FINDNAME:{
if(findname(msg))
{
msg.action = FINDSUC;
send(sockfd,&msg,sizeof(struct message),0);
printf("------find successfully !\n");
break;
}
else
{
msg.action = FINDFAIL;
send(sockfd,&msg,sizeof(struct message),0);
printf("------find failure !\n");
break;
}
}
case CHATOUT:{
printf("(((((((((%s)))))))))\n",msg.toname);
chat(msg);
printf("1111111111111111\n");
break;
}
case SENDALL:sendall(msg);break;
case DISALL:displayall(msg);break;
default:break;
}
}
}
void displayall(struct message msg)
{
Link temp;
temp = head->next;
int tofd;
if(temp->next == head)
{
if(strcmp(msg.name,temp->name) == 0)
{
tofd = temp->clientfd;
}
}
else
{
while(temp != head)
{
if(strcmp(temp->name,msg.name) == 0)
{
tofd = temp->clientfd;
break;
}
temp = temp->next;
}
}
temp = head->next;
if(temp->next == head)
{
msg.action = DISALLSUC;
strcpy(msg.toname,temp->name);
send(tofd,&msg,sizeof(struct message),0);
}
else
{
while(temp != head)
{
msg.action = DISALLSUC;
strcpy(msg.toname,temp->name);
send(tofd,&msg,sizeof(struct message),0);
sleep(1);
temp = temp->next;
}
}
}
void sendall(struct message msg)
{
Link temp;
temp = head->next;
int tofd;
if(temp->next == head)
{
if(strcmp(msg.name,temp->name) == 0)
{
msg.action = NOOTHER;
tofd = temp->clientfd;
send(tofd,&msg,sizeof(struct message),0);
}
}
else
{
while(temp != head)
{
if(strcmp(temp->name,msg.name) != 0)
{
msg.action = CHATIN;
tofd = temp->clientfd;
send(tofd,&msg,sizeof(struct message),0);
}
temp = temp->next;
}
}
}
void chat(struct message msg)
{
Link temp;
int tofd;
temp = head->next;
while(temp != head)
{
printf("++++++++++++++++++++++++++++++++++++%s\n",temp->name);
temp = temp->next;
}
temp = head->next;
if(temp->next == head)
{
if(strcmp(temp->name,msg.toname) == 0)
{
//printf("22222222222222222222\n");
tofd = temp->clientfd;
msg.action = CHATIN;
send(tofd,&msg,sizeof(struct message),0);
//printf("33333333333333333333333\n");
}
}
else
{
//printf("((((((((((((((((((((()))))))))))))))))))))");
while(temp != head)
{
// printf("%s\n",msg.toname);
if(strcmp(temp->name,msg.toname) == 0)
{
//printf("444444444444444444\n");
tofd = temp->clientfd;
msg.action = CHATIN;
printf("++++++++++++++++++++++++++++++++++++++++++++++%s\n",temp->name);
send(tofd,&msg,sizeof(struct message),0);
//printf("555555555555555555\n");
}
temp = temp->next;
}
}
}
int findname(struct message msg)
{
Link temp;
int flag = 0;
temp = head->next;
if(temp->next == head)
{
if(strcmp(temp->name,msg.toname) == 0)
flag = 1;
}
else
{
while(temp != head)
{
if(strcmp(temp->name,msg.toname) == 0)
{
flag = 1;
break;
}
temp = temp->next;
}
}
return flag;
}
int is_login(struct message msg)
{
int flag = 0;
Link temp;
temp = head->next;
if(temp->next == head)
{
if(strcmp(msg.name,temp->name) == 0)
{
if(strcmp(msg.password,temp->password) == 0)
flag = 1;
}
}
else
{
while(temp->next != head)
{
if(strcmp(msg.name,temp->name) == 0)
{
if(strcmp(msg.password,temp->password) == 0)
{
flag = 1;
break;
}
}
temp = temp->next;
}
}
return flag;
}