4.18

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值