freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于socket的聊天系統(tǒng)設(shè)計(完整版)

2024-12-28 03:28上一頁面

下一頁面
  

【正文】 { close(new_server_socket)。 while(request!=EXIT) { chat_package buffer。 break。send_buffer,BUFFER_SIZE,0)。 break。 } /************************************************************ *函數(shù)名稱 : process_request *功能說明 : 根據(jù)接收到的報文的內(nèi)容 ,進(jìn)行響應(yīng)的服務(wù) . * 服務(wù)類型包括 :注冊 ,登錄 ,獲取已登錄用戶列表 ,向用戶發(fā)送信息 ,退出 ,修改注冊信息 *正常返回值 : 服務(wù)器對用戶發(fā)回的響應(yīng)類型 *函數(shù)執(zhí)行失敗 : 沒有檢測和處理 *參數(shù)說明 : client_socket 是服務(wù)器與用戶通信的 socket * receive_buffer 為服務(wù)器收到的報文的內(nèi)容 *依賴自定義數(shù)據(jù)結(jié)構(gòu) : chat_package *************************************************************/ int process_request(int client_socket, char * receive_buffer) { chat_package send_buffer。 if( server_socket 0) { printf(Create Socket Failed!)。 return FAIL。iUSER_AMOUNT_MAX。user_table_mutex)。i++) { if(user_table[i].client_socket == client_socket) { 《網(wǎng)絡(luò)編程》課程設(shè)計 9 user_table[i].client_socket=NOT_LOGIN。 } } } pthread_mutex_unlock(amp。 int socket=0。 pthread_mutex_unlock(amp。i++) { if(strcmp(user_table[i].user_ID,user_ID)==0) { pthread_mutex_unlock(amp。 } } pthread_mutex_unlock(amp。\039。(strcmp(user_table[i].password,password)==0) ) { user_table[i].client_socket = client_socket。 bzero(user_table[i].password,OPTION_SIZE)。 //訪問 user_table 時要使用的信號量 pthread_mutex_t user_table_mutex。 }chat_package。 實現(xiàn)目標(biāo) 根據(jù)客戶機提出各種請求 ,服務(wù)器能夠根據(jù)不同請求 ,做出 不同的響應(yīng),能實現(xiàn)多客戶同時在線進(jìn)行聊天的功能 。 程序通過了 驗證與測試,證明了系統(tǒng)的 可用性、易用性、完善性。 服務(wù)器端采用多線程 , 為每個連接的客戶建立一個服務(wù)線程 ,多客戶端同時連接服務(wù)器,客戶端之間能夠進(jìn)行會話。 char option[OPTION_SIZE +1]。 int client_socket。iUSER_AMOUNT_MAX。iUSER_AMOUNT_MAX。user_table_mutex)。iUSER_AMOUNT_MAX。 int i=0。i++) { if(NOT_IN_USE == user_table[i].client_socket) { user_table[i].client_socket = NOT_LOGIN。 return FAIL。 pthread_mutex_unlock(amp。 int i=0。user_table_mutex)。user_table_mutex)。 《網(wǎng)絡(luò)編程》課程設(shè)計 10 return SUCCEED。 = htons(INADDR_ANY)。 } if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) ) { printf(Server Listen Failed!)。 char * receiver = ((chat_package *)receive_buffer)to。 break。 break。 return 。 if (length 0) 《網(wǎng)絡(luò)編程》課程設(shè)計 13 { printf(Server Recieve Data Failed!\n)。 pthread_exit(NULL)。child_thread_attr)。 if ( new_server_socket 0) { printf(Server Accept Failed!\n)。 pthread_mutex_destroy(amp。 bzero(amp。 } //把客戶機的 socket 和客戶機的 socket 地址結(jié)構(gòu)聯(lián)系起來 if( bind(client_socket,(struct sockaddr*)amp。) == 0) //服務(wù)器的 IP 地址來自程序的參數(shù) { printf(Server IP Address Error!\n)。 } /************************************************************ *函數(shù)名稱 : send_request_to_server *正常返回值 : 發(fā)送到服務(wù)器的報文的字節(jié)數(shù) *函數(shù)執(zhí)行失敗 : 發(fā)送失敗返回值為 1 *參數(shù)說明 : 當(dāng)不使用 option 時 , option 應(yīng)當(dāng)是 NULL * 當(dāng)不 使用 message 時 , message 應(yīng)當(dāng)是 NULL *依賴自定義數(shù)據(jù)結(jié)構(gòu) : chat_package *************************************************************/ void send_request_to_server(signed char request, char * option, char * to, char * message) { static chat_package buffer。 if(message) memcpy(, message, MESSAGE_SIZE)。 int length = recv(client_socket,(char*)amp。 bzero((char*)amp。 if(from) memcpy(from, , ID_SIZE)。 printf(\n)。 printf(%d:LOGIN\n,LOGIN)。 switch(mand_option) { case REGISTER: printf(Input Your User_ID:)。 printf(Input Your Password:)。 printf(Write Your Message Here:)。 scanf(%s,user_ID)。 bzero(option,ID_SIZE+1)。 case SUCCEED: if(strcmp(option, USER_LIST)==0) print_user_list(message)。 bzero(password,BUFFER_SIZE)。 設(shè)計總結(jié) 通過本次課程設(shè)計,我們加深了對 Linux下用 C 語言進(jìn)行 socket編程的認(rèn)識和了解,并且更好的掌握了對 socket 原理以及結(jié)構(gòu)的認(rèn)識。 在客戶方呼叫連接請求之前,它必須知道服務(wù)方在哪里。 在這次設(shè)計中,我們小組三人通力合作,不驕不躁,始終共同進(jìn)行設(shè)計 ,并最終很好的實現(xiàn)了設(shè)計要求。 【 5】 楊延雙等 , 《 TCP/IP 協(xié)議分析及應(yīng)用》 , 機械工業(yè)出版社 , 202021。 。 【 7】 (美)多納霍 、 (美)卡爾弗特著,陳宗斌等譯 , 《 TCP/IP Sockets 編程( C 語言實現(xiàn))(第 2 版)》 , 清華大學(xué)出版社 , 20201101 第二版。 成員分工 張栢菁: 系統(tǒng)分析, 代碼編寫及處理。也就是說,客戶方可以通過服務(wù) 方所在機器的 IP地址或機器名稱和端口號唯一的確定方式來呼叫服務(wù)方。 Socket 用于在兩個基于 TCP/IP 協(xié)議的應(yīng)用程序之間相互通信。 talk_to_server()。 break。 bzero(message,MESSAGE_SIZE+1)。 scanf(%s,password)。 send_request_to_server(mand_option, 0, receiver_user_ID, message_buffer)。 send_request_to_server(mand_option, 0, 0, 0)。 printf(Input Your Password:)。 printf(%d:TALK_TO\n,TALK_TO)。 // 一個 很大的緩沖 區(qū) , 實際MESSAGE_SIZE 內(nèi)有效 bzero(message_buffer,BUFFER_SIZE)。 return 。 int flags = ftl(client_socket, F_GETFL, 0)。 if(length0) { printf(Receive Data From Server Failed\n)。buffer,BUFFER_SIZE,0)0) { printf(Socket Send Data Failed Or Closed\n)。buffer,BUFFER_SIZE)。 } 《網(wǎng)絡(luò)編程》課程設(shè)計 16 = htons(CHAT_SERVER_PORT)。 return FAIL。 //把一段內(nèi)存區(qū)的內(nèi)容全部設(shè)置為 0 = AF_INET。 pthread_exit (NULL)。 } if( pthread_create(amp。child_thread_attr,PTHREAD_CREATE_DETACHED)。 pthread_mutex_init(amp。 pthread_exit(NULL)。 int request = NO_COMMAND。 return 。 send(client_socket, (chat_package *)amp。 switch(((chat_package *)receive_buffer)type) { case REGISTER: = user_register(user_ID, password, client_socket)。 《網(wǎng)絡(luò)編程》課程設(shè)計 11 } return server_socket。 int server_socket = socket(AF_INET,SOCK_STREAM,0)。user_table_mutex)。 }
點擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1