#include <stdio.h>
#include <strings.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <stdlib.h>
#include <time.h>
#define PORT 1234
#define BACKLOG 1
#define Max 5
#define MAXSIZE 1024
struct user
{
int fdt;
char name[20];
};
struct message
{
char from_name[20];
char to_name[20];
char mess[1024];
int flag;
char time_now[25];
};
/*定义全局变量*/
struct message m;
int number=0;
char inf[1024];
char private[1024]="Private:";
char sign[2]=":";
char sendbuf[1024];
int count=0;
char fi[40];
struct user u[Max];
char file[50]="/home/hw2-5/server/";
FILE *f;
char *get_time()
{
time_t time_now;
time(&time_now);
return(ctime(&time_now));
}
void *pthread_service(void* sfd)
{
int fd=*(int *)sfd;
while(1)
{
char Na[30];
char Si[2];
strcpy(Si,sign);
int numbytes;
int i;
numbytes=recv(fd,&m,sizeof(struct message),0);
if(numbytes>0){
if(m.flag==0){
for(i=0;i<Max;i++){
if(fd==u[i].fdt){
strcpy(u[i].name,m.from_name);
}
}
}
else if(m.flag==1){
strcpy(Na,m.from_name);
strcpy(Si,sign);
strcpy(inf,m.mess);
strcat(Na,Si);
strcat(sendbuf,Na);
strcat(sendbuf,inf);
strcpy(m.mess,sendbuf);
}
else if(m.flag==2){
strcat(file,m.mess);
f=fopen(file,"wb+");
if(f==NULL){
printf("open file fail!!");
break;
}
}
else if(m.flag==3){
fwrite(&m.mess,strlen(m.mess),1,f);
}
else if(m.flag==4){
fclose(f);
sprintf(fi,"%s:send you a file,do you want?(y/n)",m.from_name);
strcpy(m.mess,fi);
}
else if(m.flag==5){
if(strcmp(m.mess,"y\n")==0){
f=fopen(file,"ab+");
if(f==NULL){
printf("open file fail!!");
break;
}
rewind(f);
struct stat statbuf;
stat(file,&statbuf);
int size=statbuf.st_size;
while(!feof(f))
{
m.flag=5;
if(size>=900){
fread(m.mess,900,1,f);size-=900;
m.mess[901]="\0";
}
else{
fread(m.mess,size,1,f);
m.mess[size+1]="\0";
}
send(fd,&m,sizeof(struct message),0);
bzero(m.mess,1024);
}
fclose(f);
m.flag=6;
send(fd,&m,sizeof(struct message),0);
}
}
strcpy(file,"/home/hw2-5/server/");
}
else if(numbytes<=0)
{
for(i=0;i<Max;i++){
if(fd==u[i].fdt){
u[i].fdt=0;
}
}
printf("numbytes=%d\n",numbytes);
printf("exit! fd=%d\n",fd);
number--;
break;
}
printf("receive message from %d,size=%d,flag:%d\n",fd,numbytes,m.flag);
if(m.flag==0 || m.flag==1 || m.flag==4){SendToClient(fd,numbytes);}
bzero(m.mess,sizeof(m.mess));
bzero(Na,sizeof(Na));
bzero(Si,sizeof(Si));
bzero(sendbuf,sizeof(sendbuf));
}
close(fd);
}
int SendToClient(int fd,int Size)
{
int i;
strncpy(m.time_now, get_time(), 25);
if(strcmp(m.to_name,"0")==0){
for(i=0;i<Max;i++){
printf("u[%d].fdt=%d\n",i,u[i].fdt);
if((u[i].fdt!=0)&&(u[i].fdt!=fd)){
send(u[i].fdt,&m,sizeof(struct message),0);
printf("send public message to %d\n",u[i].fdt);
}
}
}
else{
for(i=0;i<Max;i++){
if(strcmp(m.to_name,u[i].name)==0){
strcat(private,m.mess);
strcpy(m.mess,private);
send(u[i].fdt,&m,sizeof(struct message),0);
strcpy(private,"Priavte:");
printf("send private message to %d\n",u[i].fdt);
}
}
}
return 0;
}
int main()
{
system("clear");
int listenfd, connectfd;
struct sockaddr_in server;
struct sockaddr_in client;
int sin_size;
sin_size=sizeof(struct sockaddr_in);
int fd;
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("Creating socket failed.");
exit(1);
}
int opt = SO_REUSEADDR;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr = htonl (INADDR_ANY);
if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) {
perror("Bind error.");
exit(1);
}
if(listen(listenfd,BACKLOG) == -1){
perror("listen() error\n");
exit(1);
}
printf("Waiting for client....\n");
while(1)
{
if ((fd = accept(listenfd,(struct sockaddr *)&client,&sin_size))==-1) {
perror("accept() error\n");
exit(1);
}
if(number>=Max){
printf("no more client is allowed\n");
close(fd);
}
int i;
for(i=0;i<Max;i++){
if(u[i].fdt==0){
u[i].fdt=fd;
break;
}
}
pthread_t tid;
pthread_create(&tid,NULL,(void*)pthread_service,&fd);
number=number+1;
}
close(listenfd);
}
评论2
最新资源