91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 14KB
    文件類型: .rar
    金幣: 2
    下載: 0 次
    發布日期: 2021-05-10
  • 語言: C/C++
  • 標簽: udp??聊天室??linux??c??

資源簡介

--------------udp聊天室V1.0---------------- /////////////////////////使用方法 首先啟動./server 再啟動./client 不需要加任何的參數 /////////////////////////////功能描述 支持群聊天 支持向指定用戶發送悄悄話功能 支持不同消息不同顏色顯示 用戶名為登錄的唯一標示,所以不允許重名,客戶端登錄具有重名檢查功能 支持上線下線通知 支持服務器發送系統消息功能 支持登錄時檢測服務器是否在線 支持服務器下線通知客戶端,客戶端強行下線

資源截圖

代碼片段和文件信息

//???更新日期?27/08/2011?14:18
#include?“header.h“

void?sig_user1(int?signo);
void?sig_user2(int?signo);
void?sig_alrm(int?signo);
char*?ProcessLogin(SA_IN?serv_addr);
//以下為無關緊要的功能函數聲明
void?dispDot();
int?msSleep(long?ms);

static?pid_t?pid;
static?int?socket_fd;

int?main(void)?{

char?buf[BUFFERSIZE];
char?buf_temp[BUFFERSIZE];
char?name[10];
SA_IN?serv_addr;
signal(SIGUSR1?sig_user1);
signal(SIGUSR2sig_user2);
signal(SIGINTSIG_IGN);//拒絕用戶ctrl+c強制退出只能鍵入quit退出

if?((socket_fd?=?socket(AF_INET?SOCK_DGRAM?0))?==?-1)?{
perror(“套接字創建失敗“);
exit(-1);
}
//XXX:服務器配置信息
memset(&serv_addr?0?sizeof(serv_addr));
serv_addr.sin_family?=?AF_INET;
serv_addr.sin_addr.s_addr?=?inet_addr(SERVER_IP);
serv_addr.sin_port?=?htons(SERVER_PORT);
//XXX

strcpy(name?ProcessLogin(serv_addr));//得到登錄名

if?((pid?=?fork())?==?-1)?{
perror(“子進程創建失敗“);
return?-1;
}

if?(pid?==?0)///////////////////////////////////子進程用來接收服務器的消息
{
memset(buf‘\0‘BUFFERSIZE);//必須清空否則會有虛假數據
memset(buf_temp‘\0‘BUFFERSIZE);
sprintf(buf?“C%s上線了“?name);
if?(sendto(socket_fd?buf?sizeof(buf)?0?(SA?*)?&serv_addr sizeof(serv_addr))? ?{
perror(“上線失敗“);
}
kill(getppid()?SIGUSR1);//喚醒主進程讓其輸入
while?(1)?{
memset(buf‘\0‘BUFFERSIZE);//必須清空否則會有虛假數據
memset(buf_temp‘\0‘BUFFERSIZE);
if?(recvfrom(socket_fd?buf?sizeof(buf)?0?NULL?NULL)? perror(“接收消息失敗“);
}

?if?(strncmp(“Q“buf1)?==?0)?//接收服務器下線通知
{
printf(“\033[22;30m%s“?buf+1);?//輸出黑色文字系統消息
kill(getppid()?SIGUSR2);
kill(getpid()?SIGUSR2);

}
else?if?(strncmp(“A“buf1)?==?0)
{
printf(“\033[22;96m%s“?buf+1);?//輸出灰色文字系統消息
}
else?if?(strncmp(“P“buf1)?==?0)
{
printf(“\033[22;31m%s“?buf+1);?//輸出紅色文字系統消息
}
else?if?(strncmp(“R“buf1)?==?0)
{
if?(strncmp(buf+1?name?strlen(name))?==?0)
{
sprintf(buf_temp?“我%s“?buf?+?strlen(name)+1);
printf(“\033[22;32m%s“?buf_temp);//輸出黃色文字自己的消息
}
else
printf(“\033[22;33m[收到消息@]%s“?buf+1);?//輸出綠色文字
}
printf(“\033[22;30m“);//恢復黑色
}
}
//////////////////////////////////////////////////////主進程////////////////////////////////////
pause(); //等待SIGUSR1
int?quit_flag?=?0;
getchar();//清空輸入名字時殘存的回車符因為ProcessLogin使用scanf
while?(1)//父進程
{
memset(buf‘\0‘BUFFERSIZE);//必須清空否則會有虛假數據
memset(buf_temp‘\0‘BUFFERSIZE);
fgets(buf_tempBUFFERSIZEstdin); //采用fgets比采用scanf好,聊天時可以鍵入空格
buf_temp[strlen(buf_temp)-1]=‘\0‘;
if?(strncmp(“quit“?buf_temp?4)?==?0)?//退出
{
sprintf(buf?“Q%s“?name);
quit_flag?=?1;
}
//鍵入$開頭為悄悄話
else?if?(strncmp(“$“?buf_temp?1)?==?0)?//注:發送悄悄話的格式:$對方名稱$消息內容
{
char?*check=buf_temp+1; //必須對其檢查一定要有兩個$...$否則造成服務器當機
while(*check!=‘\0‘&&*check!=‘$‘) check++;
if(*check!=‘$‘)
{
printf(“[系統提示]\n發送悄悄話格式:$對方名稱$消息內容\n<請輸入>\n“);
continue;
}


sprintf(buf?“P%s%s“?namebuf_temp);
}
else?//群發消息
{
sprintf(buf?“C%s說:%s“?name?buf_temp);
}
//開始發送消息
if?(sendto(socket_fd?buf?sizeo

?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----

?????文件???????7173??2011-08-29?08:39??ChartRoom\server.c

?????文件??????12424??2011-08-28?11:48??ChartRoom\server

?????文件???????5427??2011-08-29?08:39??ChartRoom\client.c

?????文件??????12606??2011-08-28?11:48??ChartRoom\client

?????文件????????561??2011-08-29?08:37??ChartRoom\program_statement.txt

?????文件????????448??2011-08-29?08:38??ChartRoom\header.h

?????目錄??????????0??2011-08-29?08:31??ChartRoom

-----------?---------??----------?-----??----

????????????????38639????????????????????7


評論

共有 條評論