資源簡介
在網絡聊天盛行的今天,卻沒有合適的聊天室在Linux系統中供用戶使用。本設計實現了Linux系統下簡單的網絡聊天室的設計。采用Client/Server模式,使用socket套接字和多線程的應用來進行編寫。可以創建多個窗口分別作為服務端和多個客戶端的程序。利用vim編輯器,通過gcc命令進行編譯從而實現聊天室的運行,并使用gdb調試功能進行調試。本設計的主要功能包含群聊、私聊、查看用戶列表等功能。
歡迎訪問我的博客www.ghackerm.me

代碼片段和文件信息
#include“public.h“
pthread_t?tid1;
char?g_name[NAME_LEN];
int??g_locate;
int??g_total;
void?flush(){?char?c;?do{c=getc(stdin);}while(c!=‘\n‘&&c!=EOF);};
int?CheckExist()
{
int?i;
for(i=0;i {
if(!strcmp(g_nameclientList[i].name))
break;
}
if(i {
printf(“this?name:?%s?is?already?exist!!\n“g_name);
return?1;
}
else
return?0;
}
void??ShowList()
{
int?i;
g_total=0;
?????????????????printf(“\t?_____________________________?\n“);
?????????????????printf(“\t|?????????CLIENT?LIST?????????|\n“);
?????????????????printf(“\t|_____________________________|\n“);
?????printf(“\t|\e[4m??sort???|??????name?????????\e[24m|\n?“);
????????????????//?printf(“\t|_________|___________________|\n“);
??for(i=0;i ??{
???? if(clientList[i].socketFd!=0)
???? {
???????if(i==g_locate)
???{
?????printf(“\t|\e[4;31m?*%-4d???|??%-10s???????\e[0m|\n“++g_totalclientList[i].name);
?????????????????//printf(“\t|_________|___________________|\n“);
???}
???else
???{
?????????printf(“\t|\e[4m???%-4d??|??%-10s???????\e[24m|\n“++g_totalclientList[i].name);
?????????????//????printf(“\t|_________|___________________|\n“);
???}
???? }
???}
?????????????????printf(“\t|\e[4m????????????????Total:%-3d????\e[24m|\n“g_total);
}
int?MakeTempList(int?*tmp)
{
int?in=0;
??for(i=0;i ??{
?if(clientList[i].socketFd!=0)
?????{ tmp[n]=i;?n++;?}
??}
????ShowList();
int?select;
printf(“please?select?the?user?\n“);
if(1!=scanf(“%d“&select))
{
flush();
printf(“bad?select?\n“);
return?-1;
}
if(select<=g_total)????
{
if(tmp[select-1]==g_locate)
{
printf(“\e[33m#SYSTEM:YOU?CAN?NOT?SELECT?YOURSELF\e[0m\n“);
return?-1;
}
else
return?tmp[select-1];
}
else
{
printf(“bad?select?\n“);
return?-1;
}
}
void?*RecvMsg(void?*fd)
{
int?sockfd=*(int?*)fd;
MESSAGE?msg;
????
while(1)
{
bzero(&msgsizeof(msg));?msg.type=ERROR;
read(sockfd&msgsizeof(msg));
if(msg.type==ERROR)
break;
switch(msg.type)
{
?????????case?LOGIN:
?if(msg.fromUserLocate==g_locate)
?printf(“\e[34m######??>?loing?succeed\e[0m\n“);
?else
?printf(“\e[33m#LOGIN??>?From:%-10s?Msg:%s\e[0m\n“msg.fromUsermsg.message);
?break;
?case?EXIT:
?printf(“\e[33m#EXIT???>?From:%-10s?Msg:%s\e[0m\n“clientList[msg.fromUserLocate].namemsg.message);
?break;
?case?PUBLIC:
?printf(“\e[32m#PUBLIC?>?From:%-10s?Msg:%s\e[0m\n“msg.fromUsermsg.message);
?break;
?case?PRIVATE:
?printf(“\e[31m#PRIVATE>?From:%-10s?Msg:%s\e[0m\n“msg.fromUsermsg.message);
?break;
?default:break;
}
memcpy(&clientList&msg.clientListsizeof(clientList));
}
printf(“server?is?breakdown?\n“);
exit(1);
}
void?SendMsg(int?fd)
{
?
MESSAGE?msg;
????msg.type=LOGIN;
msg.fromUserLocate=g_locate;
strcpy(msg.fromUserg_name);
strcpy(msg.messageg_name);
????write(fd&msgsizeof(msg));
int?tmp[MAX_CLIENT];
int??key;
while(1)
{??
????????printf(“?1?public??2?private?3?EXIT
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????5104??2016-01-09?13:11??源代碼\client.c
?????文件????????152??2016-01-09?13:11??源代碼\makefile
?????文件????????737??2016-01-09?13:11??源代碼\public.h
?????文件???????4623??2016-01-09?13:11??源代碼\server.c
?????目錄??????????0??2019-06-22?09:07??源代碼
-----------?---------??----------?-----??----
????????????????10616????????????????????5
- 上一篇:IGBT模塊二極管熱模型
- 下一篇:bpaieee39節點程序
評論
共有 條評論