#include #include #include #include #include #include #include #include #include #include #include #define N 1024
typedef void (*sighandler_t)(int);
typedef struct sockaddr SA;
typedef struct node
{
char name[N];
struct sockaddr_in addr;
struct node *next;
}Socklist;
typedef struct
{
char type;
char name[N];
char text[N];
}MSG;
Socklist *creat_empty()
{
Socklist *head;
head = (Socklist
*)malloc(sizeof(Socklist));
head->next = NULL;
return head;
}
void creat_list(Socklist *head,struct sockaddr_in addr,char *name)
{
Socklist *temp;
temp = (Socklist
*)malloc(sizeof(Socklist));
name[strlen(name) - 1] = ' ';
sprintf(temp->name ,"%s",
name);
temp->addr = addr;
temp->next = head->next;
head->next = temp;
return ;
}
void send_login(int socketfd,Socklist *head,char *name)
{
int test = -1;
char buff[N] = {0};
Socklist *p = head->next;
name[strlen(name) - 1] = ' ';
sprintf(buff,"%s
%s",name,"上线");
while( p != NULL )
{
if( 0 != strcmp(p->name ,name )
)
{
test =
sendto(socketfd,buff,sizeof(buff),0,(SA *)&p->addr,sizeof(p->addr));
if ( -1 == test )
{
perror("send");
exit(-1);
}
}
p = p->next;
}
bzero(buff,N);
return ;
}
void send_begin(int socketfd,Socklist *head,char *name,char *text)
{
int test = -1;
char buff[N] = {0};
Socklist *p = head->next;
name[strlen(name) - 1] = ' ';
sprintf(buff,"%s说: %s",name,text);
while( p != NULL )
{
if( 0 != strcmp(p->name ,name )
)
{
test =
sendto(socketfd,buff,sizeof(buff),0,(SA *)&p->addr,sizeof(p->addr));
if ( -1 == test )
{
perror("send");
exit(-1);
}
}
p = p->next;
}
return ;
}
void send_quiet(int socketfd,Socklist *head,char *name)
{
int test = -1;
char buff[N] = {0};
Socklist *q = head->next;
Socklist *p = head->next;
name[strlen(name) - 1] = ' ';
sprintf(buff,"%s %s",name,"下线");
while( p != NULL )
{
if( 0 != strcmp(p->name ,name )
)
{
test = sendto(socketfd,buff,sizeof(buff),0,(SA
*)&p->addr,sizeof(p->addr));
if ( -1 == test )
{
perror("send");
exit(-1);
}
}
else
{
q->next = p->next;
free(p);
p = q;
}
q = p;
p = p->next;
}
return ;
}
void send_everyone(int socketfd,Socklist *head,char *text)
{
int test = -1;
char buff[N] = {0};
Socklist *p = head->next;
sprintf(buff,"%s %s","系统通知:",text);
while( p != NULL )
{
test =
sendto(socketfd,buff,N,0,(SA *)&p->addr,sizeof(p->addr));
if ( -1 == test )
{
perror("send");
exit(-1);
}
p = p->next;
}
return ;
}
int main(int argc, const char *argv[])
{
MSG msg;
Socklist *p;
int flag = 0;
pid_t pid = -1;
int test = -1;
int socketfd;
int connectfd;
socklen_t legh;
char buff[N] = {0};
sighandler_t signo;
struct sockaddr_in
ser_addr,cli_addr;
if ( 3 != argc )
{
printf("please input %s
argv[1] argv[2] ",argv[0]);
return -1;
}
socketfd =
socket(PF_INET,SOCK_DGRAM,0);
if ( -1 == socketfd )
{
perror("socket");
return -1;
}
ser_addr.sin_family = PF_INET;
ser_addr.sin_port =
htons(atoi(argv[2]));
ser_addr.sin_addr.s_addr =
inet_addr(argv[1]);
test = bind(socketfd,(SA
*)&ser_addr,sizeof(ser_addr));
if ( -1 == test )
{
perror("bind");
return -1;
}
pid = fork();
if ( 0 == pid )
{
while(1)
{
fgets(msg.text,N,stdin);
msg.type = '#';
test =
sendto(socketfd,&msg,sizeof(msg),0,(SA
*)&ser_addr,sizeof(ser_addr));
if ( -1 == test )
{
perror("sendto");
return -1;
}
}
}
if ( 0 < pid )
{
legh = sizeof(cli_addr);
Socklist *tty =
creat_empty();
while(1)
{
test =
recvfrom(socketfd,&msg,sizeof(msg),0,(SA *)&cli_addr,&legh);
if ( -1 == test )
{
perror("recvfrom");
return -1;
}
if ( msg.type == 'L' )
{
creat_list(tty,cli_addr,msg.name);
send_login(socketfd,tty,msg.name);
}
if ( msg.type == 'B' )
send_begin(socketfd,tty,msg.name,msg.text);
if ( msg.type == 'Q' )
send_quiet(socketfd,tty,msg.name);
if ( msg.type == '#' )
{
send_everyone(socketfd,tty,msg.text);
}
}
}
}