1. Trang chủ
  2. » Luận Văn - Báo Cáo

Sử dụng socket để xây dựng chương trình chat theo mô hình client server trong ipc

37 8 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG VIỆT - HÀN KHOA KHOA HỌC MÁY TÍNH ĐỒ ÁN MƠN HỌC LẬP TRÌNH HỆ THỐNG SỬ DỤNG SOCKET ĐỂ XÂY DỰNG CHƯƠNG TRÌNH CHAT THEO MƠ HÌNH CLIENT SERVER TRONG IPC Sinh viên thực : NGUYỄN PHƯỚC THỊNH TRẦN VĂN PHÚC TRẦN QUỐC TÙNG Giảng viên hướng dẫn: TS NGUYỄN HỮU NHẬT MINH Lớp : 20SE2 | 20SE3 | 20SE2 Đà Nẵng, tháng 10 năm 2022 TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG VIỆT – HÀN KHOA KHOA HỌC MÁY TÍNH ĐỒ ÁN MƠN HỌC LẬP TRÌNH HỆ THỐNG SỬ DỤNG SOCKET ĐỂ XÂY DỰNG CHƯƠNG TRÌNH CHAT THEO MƠ HÌNH CLIENT SERVER TRONG IPC Đà Nẵng, tháng 10 năm 2022 LỜI NÓI ĐẦU Ngày nay, ứng dụng công nghệ thông tin việc tin học hóa xem yếu tố mang tính định hoạt động phủ, tổ chức, cơng ty, đóng vai trị quan trọng, tạo bước đột phá mạnh mẽ Cùng với phát triển khơng ngừng kỹ thuật máy tính mạng điện tử, công nghệ thông tin cơng nghệ có đẳng cấp cao chinh phục hết đỉnh cao đến đỉnh cao khác Mạng Internet sản phẩm có giá trị lớn lao ngày trở nên cơng cụ khơng thể thiếu, tảng cho truyền tải, trao đổi thơng tin tồn cầu Giờ đây, việc liên quan đến thông tin trở nên thật dễ dàng cho người sử dụng: cần có máy tính kết nối internet dịng liệu truy tìm gần lập tức… giới vấn đề mà bạn quan tâm ra, có đầy đủ thơng tin, hình ảnh chí đơi lúc có âm bạn cần… Bằng internet, thực nhiều công việc với tốc độ nhanh chi phí thấp nhiều so với cách thức truyền thống Chính điều này, thúc đẩy khai sinh phát triển thương mại điện tử phủ điện tử khắp giới, làm biến đổi đáng kể mặt văn hóa, nâng cao chất lượng sống người Vì vậy, chúng em thực đồ án môn học “SỬ DỤNG SOCKET ĐỂ XÂY DỰNG CHƯƠNG TRÌNH CHAT THEO MƠ HÌNH CLIENT - SERVER TRONG IPC” LỜI CẢM ƠN Chúng em xin gửi lời cảm ơn chân thành tới nhà trường tận tình bảo, góp ý tạo điều kiện cho em hồn thành đề tài nghiên cứu Đồ án mơn học “Lập trình hệ thống” cách tốt Em xin cảm ơn TS Nguyễn Hữu Nhật Minh nhiệt tình hướng dẫn em trình thực báo cáo đề tài nghiên cứu Trong trình thực đề tài nghiên cứu, thân chúng em cố gắng nỗ lực, nhiên khơng tránh khỏi sai sót Chúng em mong nhận góp ý thầy giáo, từ phía hội đồng để đề tài nghiên cứu chúng em hoàn thiện Chúng em xin chân thành cảm ơn! Đà Nẵng, tháng 10 năm 2022 NHẬN XÉT (Của giảng viên hướng dẫn) ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… MỤC LỤC Contents CHƯƠNG CƠ SỞ LÝ THUYẾT .1 1.1 Sơ lược lập trình hệ thống 1.1.1 Khái niệm lập trình hệ thống 1.1.2 Tổng quan lập trình hệ thống 1.2 Tìm hiểu truyền thơng tuyến trình – Interprocess Communication .2 1.2.1 Khái niệm Process IPC 1.2.2 Vì process phải giao tiếp với nhau? 1.2.3 Một số chế giao tiếp process Linux 1.3 Lập trình Socket Linux .3 1.3.1 Mô hình Client/Server 1.3.2 Sơ lược Socket .4 1.3.3 Minh họa lập trình Socket 1.4 Tổng quan cơng nghệ 1.4.1 Oracle VM VirtualBox 1.4.2 Ngơn ngữ lập trình C CHƯƠNG CHƯƠNG TRÌNH DEMO 12 2.1 Mã nguồn 12 2.1.1 Mã nguồn Server 12 2.1.2 Mã nguồn Client .16 2.2 Demo chương trình 21 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN .26 Kết luận 26 Hướng phát triển .26 DANH MỤC THAM KHẢO 27 DANH MỤC CÁC BẢNG DANH MỤC HÌN Hình – Sơ lược lập trình hệ thống .1 Hình – Mơ hình hoạt động Stream Sockets .5 Hình – Mơ hình hoạt động Datagram Sockets Hình – Logo VirtualBox Hình – Giao diện VirtualBox Hình – Logo ngơn ngữ lập trình C Hình – Lý nên sử dụng C Hình – Khởi động Server .17 Hình – Khởi động Client .18 Hình 10 – Chat client server 19 Hình 11 – Kết thúc trị chuyện 20 Y DANH MỤC CỤM TỪ VIẾT TẮT STT Cụm từ IPC OS TCP UDP Viết tắt Inter-Process Communication Operating System Tranmission Control Protocol User Datagram Protocol struct sockaddr_in server , client; socket_desc = socket(AF_INET , SOCK_STREAM , 0); if (socket_desc == -1) { printf("Could not create socket"); } server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons( port_number ); if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0) { puts("bind failed"); return 1; } fp = fopen (output_file_name, "w"); signal(SIGINT, INThandler); printMagenta("~~~ You have entered The Chat Room ~~~\n"); fputs("~~~ You have entered The Chat Room ~~~\n", fp); listen(socket_desc , 5); c = sizeof(struct sockaddr_in); while( (new_socket = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c)) ) { struct connection_t *new_connection = (struct connection_t *) (struct connection *) malloc( 13 sizeof(struct connection_t)); new_connection->p_sock = new_socket; new_connection->status = 1; new_connection->auth = 0; add_socket(new_connection); pthread_t sniffer_thread; new_sock = malloc(1); *new_sock = new_socket; pthread_create( &sniffer_thread , NULL , connection_handler , (void*) new_connection); } if (new_socket 0) { perror("could not create receving thread"); return 0; } while(connection->status) { dummy++; } broadcast(p_connection, "", 2); delete_socket(p_connection); free(p_connection); return 0; } void *receiver_handler(void *p_connection) { struct connection_t *connection = (struct connection_t*)p_connection; int sock = connection->p_sock; char username[20]; char token[41]; int read_size; 15 char client_message[2000]; char processed_client_message[2000]; while( (read_size = recv(sock , client_message , 2000 , 0)) > ) { if (!connection->auth) { strcpy(token, client_message); char ch = token[0]; int i = 0; while (ch != '\n' && ch != '\0') { username[i] = ch; i++; ch = token[i]; } username[i] = '\0'; strcpy(connection->username, username); } 2.1.2 Mã nguồn Client #include"chatclient.h" int main(int argc , char *argv[]) { if (argc 4) { printRed("Error: only pass the port number to connect to, username and password " "(e.g ./chatclient 8080 user1 xxxxx)\n"); return 1; } port_number = atoi(argv[1]); if (port_number < 1024) { printRed("Error: invalid port number\n"); return 1; } if (strlen(argv[2]) > 20) { printRed("Error: the username cannot exceed 20 characters\n"); return 1; } if (strlen(argv[3]) > 20) { printRed("Error: the password cannot exceed 20 characters\n"); return 1; } strcpy(username, argv[2]); 17 strcpy(password, argv[3]); char ch = username[0]; int i = 0; while (ch != '\0') { if (isalnum(ch)) { i++; } else { printRed("Error: only alphanumeric usernames are allowed\n"); return 1; } ch = username[i]; } if (strcmp(password, server_password) != 0) { printRed("Login error: the password is not correct\n"); return 1; } socket_desc = socket(AF_INET , SOCK_STREAM , 0); if (socket_desc == -1) { printf("Could not create socket"); } server.sin_addr.s_addr = inet_addr(ip_address); 18 server.sin_family = AF_INET; server.sin_port = htons(port_number); if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0) { puts("connect error"); return 1; } status = 1; printMagenta("~~~ You have entered The Chat Room ~~~\n"); pthread_t receiving_thread; int new_socket = socket_desc; int *new_sock; new_sock = malloc(1); *new_sock = new_socket; pthread_create( &receiving_thread , NULL , receiver_handler , (void*) new_sock); strcpy(auth_token, username); strcat(auth_token, "\n"); if( send(socket_desc , auth_token , strlen(auth_token) , 0) < 0) { puts("Log in failed"); return 1; } while (status) { 19 char str[message_limit]; fgets(str, message_limit+2, stdin); if(!status) { return 0; } if (str[0] == '\0' || str[0] == '\n') { printRed("Error: you can't send an empty message!\n"); fflush(stdin); } else { fflush(stdin); if (strlen(str) > message_limit) { printRed("Error: your message cannot exceed 1024 characters\n"); } else { if( send(socket_desc , str , strlen(str) , 0) < 0) { puts("Send failed"); return 1; } } } } 20 return 0; } void *receiver_handler(void *socket) { //Get the socket descriptor int sock = *(int*)socket; int read_size; char server_message[2000]; char processed_server_message[2000]; while( (read_size = recv(sock , server_message , 2000 , 0)) > ) { int ie = 0; for (int i = 0; i

Ngày đăng: 24/08/2023, 10:20

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w