#include
#include
#include
#include
#include
#include
#include
#include
#define N 128
#define ERRLOG(errmsg) do{\
perror(errmsg);\
printf("%s -- %s -- %d\n", __FILE__, __func__, __LINE__);\
exit(1);\
}while(0)
typedef struct{
int key;
char name[N];
char data[N];
}MSG;
typedef struct node{
struct sockaddr_in addr;
struct node *next;
}linklist_t;
linklist_t *linklist_create()
{
linklist_t *p = (linklist_t *)malloc(sizeof(linklist_t));
p->next = NULL;
return p;
}
void do_quit(int sockfd,MSG msg, linklist_t *p,struct sockaddr_in client_addr);
void do_chat(int sockfd,MSG msg, linklist_t *p,struct sockaddr_in client_addr);
void do_login(int sockfd,MSG msg, linklist_t *p,struct sockaddr_in client_addr);
int main(int argc, const char *argv[])
{
int sockfd;
struct sockaddr_in server_addr, client_addr;
socklen_t addrlen = sizeof(struct sockaddr_in);
MSG msg;
if(argc < 3)
{
fprintf(stderr, "Usage: %s \n", argv[0]);
exit(1);
}
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
ERRLOG("fail to socket");
}
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
server_addr.sin_port = htons(atoi(argv[2]));
if(bind(sockfd, (struct sockaddr *)&server_addr, addrlen) < 0)
{
ERRLOG("fail to bind");
}
pid_t pid;
if((pid = fork()) < 0)
{
ERRLOG("fail to fork");
}
else if(pid > 0)
{
while(1)
{
}
}
else
{
linklist_t *p = linklist_create();
while(1)
{
recvfrom(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&client_addr, &addrlen);
switch(msg.key)
{
case 1:
do_login(sockfd, msg, p, client_addr);
break;
case 2:
do_chat(sockfd, msg, p, client_addr);
break;
case 3:
do_quit(sockfd, msg, p, client_addr);
break;
}
}
}
return 0;
}
void do_login(int sockfd,MSG msg, linklist_t *p,struct sockaddr_in client_addr)
{
sprintf(msg.data, "-----name: %s is login-----------",msg.name);
printf("%s\n",msg.data);
linklist_t *h = p;
int len = sizeof(client_addr);
while(h->next != NULL)
{
sendto(sockfd, &msg, sizeof(msg), 0,(struct sockaddr *)&p->next->addr, len);
h = h->next;
}
linklist_t *temp = (linklist_t *)malloc(sizeof(linklist_t));
temp->addr = client_addr;
temp->next = p->next;
p->next = temp;
return;
}
void do_chat(int sockfd,MSG msg, linklist_t *p,struct sockaddr_in client_addr)
{
char buf[N];
sprintf(buf, "%s : %s",msg.name, msg.data);
strcpy(msg.data, buf);
int len = sizeof(client_addr);
while((p->next != NULL) )
{
if( memcmp(&(p->next->addr),&client_addr,sizeof(client_addr)) == 0)
{
p = p->next;
}
else
{
sendto(sockfd, &msg, sizeof(msg), 0,(struct sockaddr *)&p->next->addr, len);
p = p->next;
}
}
return;
}
void do_quit(int sockfd,MSG msg, linklist_t *p,struct sockaddr_in client_addr)
{
linklist_t *h = p;
sprintf(msg.data, "-----%s is offline------\n",msg.name);
printf("%s\n",msg.data);
while(memcmp(&h->next->addr,&client_addr,sizeof(client_addr)) != 0)
{
h = h->next;
}
linklist_t *temp = h->next;
h->next = h->next->next;
free(temp);
temp = NULL;
while(p->next != NULL)
{
sendto(sockfd, &msg, sizeof(msg), 0,(struct sockaddr *)&p->next->addr, sizeof(struct sockaddr_in));
p = p->next;
}
}
#include
#include
#include
#include
#include
#include
#include
#include
#define N 128
#define ERRLOG(errmsg) do{\
perror(errmsg);\
printf("%s -- %s -- %d\n", __FILE__, __func__, __LINE__);\
exit(1);\
}while(0)
typedef struct{
int key;
char name[N];
char data[N];
}MSG;
int main(int argc, const char *argv[])
{
int sockfd;
struct sockaddr_in server_addr;
socklen_t addrlen = sizeof(struct sockaddr_in);
if(argc < 3)
{
fprintf(stderr, "Usage: %s \n", argv[0]);
exit(1);
}
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
ERRLOG("fail to socket");
}
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
server_addr.sin_port = htons(atoi(argv[2]));
MSG msg;
bzero(&msg, sizeof(msg));
printf("please enter your name:");
msg.key = 1;
fgets(msg.name, N, stdin);
msg.name[strlen(msg.name) - 1] = '\0';
if((sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&server_addr,addrlen)) < 0)
{
ERRLOG("fail to sendto");
}
pid_t pid;
pid = fork();
if(pid > 0)
{
while(1)
{
fgets(msg.data, N, stdin);
msg.key = 2;
msg.data[strlen(msg.data) - 1] = '\0';
if(strcmp(msg.data,"quit") == 0)
{
msg.key = 3;
}
if((sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&server_addr,addrlen)) < 0)
{
ERRLOG("fail to sendto");
}
if(msg.key == 3)
{
sleep(1);
return 0;
}
}
}
else if(pid == 0)
{
while(1)
{
if((recvfrom(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&server_addr,&addrlen)) < 0)
{
ERRLOG("fail to sendto");
}
printf("%s\n",msg.data);
}
}
return 0;
}