【正文】
} return 0。 strcat(buf,i_ntoa(headsin_addr))。 buf[0]=39。 //send_list( head)。(39。 //send_list( head)。amp。 } int find_user(USER_LIST head,int newfd) { while(head!=NULLamp。 return del_p。 pointernext=NULL。 } else { printf(%s\n,buf++)。amp。amp。) { printf( 你的客戶端號 :%d\n,buf[1])。 pri_rec(buffer_r)。, BUFF_SIZE)。, BUFF_SIZE)。 } else { close(sockfd)。 FD_SET(STDIN_FILENO, amp。 struct timeval ts。 // int count = 1。 default: break。 while ((c = getopt (argc, argv, p:i:)) != 1) switch (c) { case 39。 int rc, wc。 } }//while (RUNNING) accept close(sockfd)。newfd)。 } else { next_p=last_p(head)。client_addr, amp。attr, PTHREAD_SCOPE_SYSTEM)。 pthread_t pt = 1。//ipv4 = htonl(INADDR_ANY)。 } sockfd = socket(AF_INET, SOCK_STREAM, 0)。 forward(head,buffer_r,newfd)。 err_sys(server recv) } else if (rc == 0) { USER_LIST delet=delete_pointer(find_user(head,newfd), head)。 err_sys(server select) } }//if (ret == 1) else if (ret == 0) { //fprintf(stderr, server time out\n)。 ret = select(maxfd + 1, amp。 = 1。 void *start_routine(void *arg)//thread function { fd_set readfds。 4 詳細流程圖 : 16 具體操作 (1)在 Linux 的 VI 編輯器下編寫服務(wù)器端程序 serv. c 和客戶端程序 。這樣每個方向上都有一個 FIN 和 ACK 15 第五 章 linux 下 socket 編程實現(xiàn)過程 聊天室 socket 編譯鏈接過程 1 監(jiān)聽鏈接 利用 socket, bind, listen 建立鏈接,步驟是: (1) 先利用 socket 函數(shù)處事話 socket 端口,獲得 sock_fd(一種文件描述符)。 返回值:整型套接口描述符。 功能:用來與遠端服務(wù)器建立一個 TCP 連接。 type指定套接口的類型,為 SOCK_STREAM、 SOCK_DGRAM 或 SOCK_RAW。 ntohs() —— “Network to Host Short” 網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)換為主機字節(jié)順序(對無符號短型進行操作 4 bytes)。 指向 sockaddr_in 的指針和指向 sockaddr 的指針可以相互轉(zhuǎn)換,這意味著如果一個函數(shù)所需參數(shù)類型是 sockaddr 時,你可以在函數(shù)調(diào)用的時候?qū)⒁粋€指向 sockaddr_in 的指針轉(zhuǎn)換為指向 sickaddr 的指針;或者相反。 /* 14 字節(jié)的協(xié)議地址 */ }。 TCP/IP 協(xié)議模型及 各層所用協(xié)議 如圖所示。在進程中共享的變量必須用關(guān)鍵字 volatile 來定義,這是為了防止編譯器在優(yōu)化時(如 gcc 中使用 OX參數(shù))改變它們的使用方式。一個進程可以有多個線程,也就 是有多個線程控制表及堆棧寄存器,但卻共享一個用戶地址空間。 break 在代碼里設(shè)置斷點 , 這將使程序執(zhí)行到這里時被掛起。如 file 裝入想要調(diào)試的可執(zhí)行文件。這就是 Makefile 的規(guī)則。 makefile帶來的好處就是 —— “自動化編譯”,一旦 寫好,只需要一個 make 命令,整個工程完全自動編譯,極大的提高了軟件開發(fā)的效率。 g,產(chǎn)生符號調(diào)試工具 (GNU 的 gdb)所必要的符號資訊,要想對源代碼進行調(diào)試,我們就必須加入這個選項。當所有的目標文件都生成之后, gcc 就調(diào)用 ld來完成最后 的關(guān)鍵性工作,這個階段就是連接。它是一套以 GPL 及 LGPL 許可證所發(fā)行的自由軟件,也是 GNU 計劃的關(guān)鍵部分,亦是自由的類 Unix 及蘋果電腦 Mac OS X 操作系統(tǒng) 的標準編譯器。 客戶端:主要用于查看在線人數(shù)、發(fā)送信息給特定用戶等功能, 總體設(shè)計 本聊天室系統(tǒng)采用了 c/s 形式。套接字可以被看做一 個專門的管道,但又不像管道,套接字對它們能容納的數(shù)量沒有限制,且 Linux 支持多種類型的套接字。 網(wǎng)絡(luò)編程可以做如下工作:網(wǎng)絡(luò)安全,通訊設(shè)備研發(fā),協(xié)議分析 , 網(wǎng)絡(luò)管理系統(tǒng) 等 。服務(wù)器設(shè)計與實現(xiàn)過程中 采用了多線程技術(shù),可以在單個程序當中同時運行多個不 同的線程 執(zhí)行不同的任務(wù)。 關(guān)鍵字: TCP/IP; linux; socket Design and Implementation of Inter chat rooms under Linux Linren Ming Of Computer Science, Communication Engineering 2021 Instructor: Yue Miao Abstract: This system uses a bination of C / S structure, between the client and the client and customer client and serverside through the TCP / IP protocolbased Socket sets of interfaces to deliver messages. Used in server design and implementation of multithreading technology, in a single program which is running a number of different threads to perform different tasks. Greatly enhanced the program on the use of server resources. To write and debug serverside program and client program under Linux, the connection between the client, server and munications. Two windows can be opened up on a standalone client and server, or the two hosts links, respectively, as the client and server. Overall, this design embedded C language for the development of language, the use of work sockets 2 socket connection is established and run multithreaded data exchange program GCC debugging can be used in standalone work. Keywords: TCP / IP。再有,且其內(nèi)核小、效率高、兼容性好和穩(wěn)定性強等優(yōu)點。 第二章 linux 網(wǎng)絡(luò)聊天室 設(shè)計思想 功能分析 本系統(tǒng)是想在 linux 系統(tǒng)下實現(xiàn)一個聊天室系統(tǒng),只要有服務(wù)器和客戶端。客戶狀態(tài)分為鏈接客戶和非連接客戶,我采用結(jié)構(gòu)體存儲鏈接客戶信息,以鏈表來記錄鏈接客戶。 命令 gcc 首先調(diào)用 cpp 進行預(yù)處理,在預(yù)處理過程中, 對源代碼文件中的文件包含 (include)、預(yù)編譯語句 (如 宏 定義 define 等 )進行分析。 c,只編譯,不連接成為可執(zhí)行文件,編譯器只是由輸入的 .c 等源代碼文件生成 .o 為后綴的目標文件,通常用于編譯不包含主程序的子程序文件。對于 A類,預(yù)處理程序 cpp 在系統(tǒng)預(yù)設(shè)包含文件目錄 (如 /usr/include)中搜尋相應(yīng)的文件,而B類,預(yù)處理程序在目標文件的文件夾內(nèi)搜索相應(yīng)文件。 mand 也就是 make 需要執(zhí)行的命令。在編譯時用 g 選項打開調(diào)試選項。 run 執(zhí)行當前被調(diào)試的程序。 8 第 四 章 關(guān)鍵技術(shù)分析 linux 線程 間通信 線程是一個進程內(nèi)的基本調(diào)度單位,也可以稱為輕量級進程。許多函數(shù)是不可重入的,即同時不能運行一個函數(shù)的多個拷貝(除非使用不同的數(shù)據(jù)段)。網(wǎng)絡(luò)應(yīng)用程序之間通過套接口來實現(xiàn)通信。 Linux 支持多種套接 口地址結(jié)構(gòu),在這兒只介紹一下 IPV4 套接口地址結(jié)構(gòu)和通用套接口地址結(jié)構(gòu)。 /* 端口號 */ struct in_addr sin_addr。所以對與內(nèi)部字節(jié)表示順序和網(wǎng)絡(luò)字節(jié)順序不同的機器,一定要對數(shù)據(jù)進行轉(zhuǎn)換(比如 IP 地址的表示,端口號的表示)。 (注: i_addr()返回的地方已經(jīng)是網(wǎng)絡(luò)字節(jié)順序了 ) 也可以把一個 struct in_addr 代表的 IP地址打印出來(按照 數(shù)字 .數(shù)字 .數(shù)字 .數(shù)字的格式)如 printf(“%s”,i_ntoa() )。 功能:關(guān)閉套接字,執(zhí)行 close()之后,套接字將不再允許進行讀操作和寫操作。 原型: int accept(int sockfd, void *addr,int *addrlen )?,F(xiàn)在我們介紹 socket 中的四次握手釋放連接的過程,請看下圖: 圖示過程為:某個應(yīng)用進程首先調(diào)用 close 主動關(guān)閉連接,這時 TCP 發(fā)送一個FIN M;另一端接收到 FIN M 之后,執(zhí)行被動關(guān)閉,對這個 FIN 進行確認。 2 發(fā)送請求 (1) 獲取主機信息 (2) 初始化 socket 端口 (3)利用 connect 函數(shù)講自己的 IP 地址等信息發(fā)送到主機,等待主機接受信息。 (3)在一臺計算機的終端先運行服務(wù)器程序 (./multithread_tcp_server p 8080),再在客戶端的計算機終端上運行客戶端程序 ()就會看到結(jié)果 ;運行結(jié)果如 下所示。 char buffer_r[BUFF_SIZE]。readfds)。 if(delet!=NULL) head=delet。, BUFF_SIZE)。readfds)。 socklen_t addrlen = addr_size。 bzero(amp。 err_sys(server bind) } if (listen(sockfd, BACK_LOG) == 1)//closedlisten { shutdown(sockfd, SHUT_RD | SHUT_WR)。 pthread_attr_setdetachstate(amp。 22 bzero(amp。 } if(head==NULL) { next_p=creat_pointer()。 /***************Create a new slave thread**********************/ ret = pthread_create(amp。 fprintf(stderr, Master thread[%u] created a new thread failurefully\n, 23 pthread_self())。 struct sockaddr_in server_addr。 if(argc != 5) { fprintf(stderr, Usage:%s p server_port i server_ip\n, argv[0])。i39。 = AF_INET。