基于Linux的聊天室(客户端)初成版

实现注册、登入、下线、私聊、群聊、传文件、在线用户查询,以及管理员(root)的禁言,解禁,踢人等功能,与服务器进行连接。

 

/*****************************************************
copyright (C), Nanjing University of ZiJin
File name:client.c
Author: CaoMengDe  Version:0.1    Date: 2017-01-01 14:38
Description:
Funcion List: 
*****************************************************/


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


#define PORTNUMBER 9997


void menu();//主菜单
int registration(int fd);//注册帐号
int signin(int fd);//登入帐号判断
void up(int fd);//上线
void *func(void* arg);//线程
int privatechat(int fd);//私聊
int groupchat(int fd);//群聊
void print(int fd);//显示当前在线用户
int Prohibition(int fd);//禁言
int Liftban(int fd);//解禁
int Kick(int fd);//踢人
void printlist(int fd);//管理员查看在线人数
int catban(int fd);//查看被禁言用户
int file(int fd);//文件传输


int privatechat_judge = 0;//判断是否禁言
int groupchat_judge = 0;
int down_judge = 0;//判断是否下线
int find_judge = 0;
int again_judge = 0;




int main()
{
//AF_INET:IPv4
//SOCK_STREAM:流式SOCKET,代表TCP
int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == socket_fd)
{
perror("socket");
exit(1);
}

struct sockaddr_in client_addr;


    //清空addr
memset(&client_addr, 0, sizeof(client_addr));
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(PORTNUMBER);
//将本机器上所有long数转化为网络字节许。
//UNADDR_ANY 可以接收任意IP地址
char argv[] = "127.0.0.1";
client_addr.sin_addr.s_addr = inet_addr(argv);

if (-1 == connect(socket_fd, (struct sockaddr *)(&client_addr), sizeof(struct sockaddr)))
{
perror("connect");
exit(2);
}
    while(1)
{

menu(socket_fd);
}
    return 0;
}


void *func(void* arg)
//线程
{
while(1)
{
char buffer[1024] = {0};
int socket_fd = (int)arg;
int ret = read(socket_fd, buffer, 1024);
if(-1 == ret)
{
perror("func");
exit(1);
}
if(strcmp(buffer, "privatechat_ok") == 0)
{
privatechat_judge = 1;
continue;
}
if(strcmp(buffer, "privatechat_error") == 0)
{
privatechat_judge = 2;
continue;
}
if(strcmp(buffer, "down_success") == 0)
{
down_judge = 1;
continue;
}
if(strcmp(buffer, "groupchat_success") == 0)
{
groupchat_judge = 1;
continue;
}
if(strcmp(buffer, "groupchat_error") == 0)
{
groupchat_judge = 2;
continue;
}
if(strcmp(buffer, "no_find") == 0)
{
find_judge = 1;
continue;
}
if(strcmp(buffer, "kick_success") == 0)
{
close(socket_fd);
printf("你已被管理员强制下线!!\n");
exit(1);


}

if(strcmp(buffer, "again_operate") == 0)
{
again_judge = 1;
continue;
}
if(strcmp(buffer, "file_accept") == 0)
{
char str[1024] = {0};
char tt[1024] = {0};
read(socket_fd, str, 1024);
int fd2 = open(str, O_CREAT|O_RDWR, S_IRWXU);
if(-1 == fd2)
{
perror("funcopen");
return;
}
while(ret = read(socket_fd, tt, 1024))
{
if(strcmp(tt, "end_file") == 0)
{
break;
}
write(fd2, tt, 1024);
memset(tt, 0, 1024);
}
printf("已收到发送的文件\n");
continue;
}

printf("%s\n", buffer);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值