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
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值