logo资料库

C语言用UDP 实现局域网聊天程序源码.doc

第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
资料共13页,剩余部分请下载后查看
#include #include #include #include #include #include #include #include #define CLIENT_LOGIN #define CLIENT_CHAT #define CLIENT_QUIT #define SERVER_CHAT #define SERVER_QUIT 100 200 300 400 500 struct node { char name[20]; struct sockaddr_in client_addr; struct node *next; }; struct message { long type; char name[20]; char mtext[512]; }; struct node *create_list(void); void insert_list(struct node *, char *, struct sockaddr_in *); void delete_list(struct node *, char *); void recv_message(int , struct node *); void send_message(int , struct sockaddr_in *, pid_t ); void client_login(int , struct node *, struct message *, struct sockaddr_in *); void client_chat(int , struct node *, struct message *); void client_quit(int , struct node *, struct message *); void server_chat(int , struct node *, struct message *); void server_quit(int , struct node *, struct message *);
void brocast_msg(int , struct node *, struct message *); void father_func(int sig_no) { return ; } int main(int argc, const char *argv[]) { int socket_fd; pid_t pid; struct sockaddr_in server_addr; struct node *head; if (argc < 3) { fprintf(stderr, "usages : %s ip port\n", argv[0]); exit(-1); } if ((socket_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("failed to create socket"); exit(-1); } head = create_list(); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); if (bind(socket_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("failed to bind"); exit(-1); } if ((pid = fork()) < 0) { perror("failed to fork pid"); exit(-1); } //创建子经常
if (pid == 0) recv_message(socket_fd, head); else send_message(socket_fd, &server_addr, pid); return 0; } struct node *create_list(void) { struct node *head; head = (struct node *)malloc(sizeof(struct node)); head->next = NULL; return head; } void insert_list(struct node *head, char *name, struct sockaddr_in *client_addr) { struct node *new; new = (struct node *)malloc(sizeof(struct node)); strcpy(new->name, name); new->client_addr = *client_addr; new->next = head->next; head->next = new; return ; } void delete_list(struct node *head, char *name) { struct node *p = head->next; struct node *q = head; while (p != NULL) { if (strcmp(p->name, name) == 0) break; p = p->next;
q = q->next; } q->next = p->next; p->next = NULL; free(p); return ; } void recv_message(int socket_fd, struct node *head) { struct message msg; struct sockaddr_in client_addr; int client_addrlen = sizeof(struct sockaddr); while (1) { if (recvfrom(socket_fd, &msg, sizeof(msg), 0, (struct sockaddr *)&client_addr, &client_addrlen) < 0) { } perror("failed to recvform client"); exit(-1); switch(msg.type) { case CLIENT_LOGIN: client_login(socket_fd, head, &msg, &client_addr); break; case CLIENT_CHAT: client_chat(socket_fd, head, &msg); break; case CLIENT_QUIT: client_quit(socket_fd, head, &msg); break; case SERVER_CHAT: server_chat(socket_fd, head, &msg); break; case SERVER_QUIT:
server_quit(socket_fd, head, &msg); break; default: break; } } return ; } void send_message(int socket_fd, struct sockaddr_in *server_addr, pid_t pid) { struct message msg; char buf[512]; signal(getppid(), father_func); while (1) { usleep(500); printf(">"); fgets(buf, sizeof(buf), stdin); buf[strlen(buf) - 1] = 0; strcpy(msg.mtext, buf); strcpy(msg.name , "server"); msg.type = SERVER_CHAT; if (strncmp(buf, "quit", 4) == 0) { msg.type = SERVER_QUIT; if (sendto(socket_fd, &msg, sizeof(msg), 0, (struct sockaddr *)server_addr, sizeof(struct sockaddr)) < 0) { } perror("failed to send server_quit message"); exit(-1); pause(); kill(pid, SIGKILL); waitpid(pid, NULL, 0);
exit(0); } if (sendto(socket_fd, &msg, sizeof(msg), 0, (struct sockaddr *)server_addr, sizeof(struct sockaddr)) < 0) perror("failed to send server_chat message"); exit(-1); { } } return ; } void client_login(int socket_fd, struct node *head, struct message *msg, struct sockaddr_in *client_addr) { printf("********Login In********\n"); printf("%s is Login In\n", msg->name); printf("************************\n"); insert_list(head, msg->name, client_addr); brocast_msg(socket_fd, head, msg); return ; } void client_chat(int socket_fd, struct node *head, struct message *msg) { printf("********Group Chat********\n"); printf("name: %s\n", msg->name); printf("msg: %s\n", msg->mtext); printf("**************************\n"); brocast_msg(socket_fd, head, msg); return ; } void client_quit(int socket_fd, struct node *head, struct message *msg) { printf("*********Quit Msg********\n"); printf("%s is Quit\n", msg->name); printf("*************************\n");
delete_list(head, msg->name); brocast_msg(socket_fd, head, msg); return ; } void server_chat(int socket_fd, struct node *head, struct message *msg) { printf("********Server Msg*********\n"); printf("msg: %s\n", msg->mtext); printf("***************************\n"); brocast_msg(socket_fd, head, msg); return ; } void server_quit(int socket_fd, struct node *head, struct message *msg) { brocast_msg(socket_fd, head, msg); kill(getppid(), SIGUSR1); return ; } void brocast_msg(int socket_fd, struct node *head, struct message *msg) { struct node *p = head->next; while(p != NULL) { if (msg->type == CLIENT_LOGIN) { if (strcmp(p->name, msg->name) == 0) { p = p->next; continue; } } sendto(socket_fd, msg, sizeof(struct message), 0, (struct sockaddr *)&(p->client_addr), sizeof(struct sockaddr)); p = p->next;
} return ; }
分享到:
收藏