多執行緒的聊天室的伺服器端

2021-07-24 21:23:04 字數 4048 閱讀 9604

伺服器端的主要功能: 

實現多使用者群體聊天功能(此程式最多設定為10人,可進行更改),每個人所傳送的訊息其他使用者均可以收到。使用者可以隨意的加入或退出(推出以字串「bye」實現),伺服器也可以進行關閉。 

伺服器端的程式結構: 

總共有三個函式:主函式(main),實現伺服器端的初始化,接受連線;訊息處理函式(rcv_snd),接受某一使用者的訊息,將其進行簡單處理之後傳送給其他所有的使用者;退出函式(quit),可實現伺服器關停。 

這三個函式分別從屬於三個執行緒(準確說是大於等於三個,下面說明原因):main函式的作為誅仙程執行緒,又建立了乙個退出函式所在的執行緒,以及每次接受到乙個連線之後會新建立乙個對此連線的訊息進行處理的執行緒(多於三個的原因在此)。

具體**實現如下:

#include

#include

#include

#include

#include

#define listenq 5

#define maxline 512

#define maxmem 10

#define namelen 20

int listenfd,connfd[maxmem];//分別記錄伺服器端的套接字與連線的多個客戶端的套接字

void quit();//伺服器關閉函式

void rcv_snd(int n);//伺服器接收並**訊息函式

int main()

//呼叫bind函式使得伺服器端的套接字與位址實現繫結

printf("bind...\n");

servaddr.sin_family=af_inet;

servaddr.sin_port=htons(6666);

servaddr.sin_addr.s_addr=htonl(inaddr_any);

if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)

//呼叫listen函式,將乙個主動連線套接字變為被動的傾聽套接字

//在此過程中完成tcp的三次握手連線

printf("listening...\n");

listen(listenfd,listenq);

//建立乙個執行緒,對伺服器程式進行管理(關閉)

pthread_create(&thread,null,(void*)(&quit),null);

//記錄空閒的客戶端的套接字描述符(-1為空閒)

int i=0;

for(i=0;i1;

} while(1)

} //呼叫accept從listen接受的連線佇列中取得乙個連線

connfd[i]=accept(listenfd,(struct sockaddr*)&cliaddr,&len);

ticks=time(null);

sprintf(buff,"% .24s \r \n",ctime(&ticks));

printf("%s connect from: %s,port %d\n\n",buff,inet_ntoa(cliaddr.sin_addr.s_addr),ntohs(cliaddr.sin_port));

//針對當前套接字建立乙個執行緒,對當前套接字的訊息進行處理

pthread_create(malloc(sizeof(pthread_t)),null,(void*)(&rcv_snd),(void*)i);

} return

0;

} void quit()

} } void rcv_snd(int n)

//把當前使用者的加入告知所有使用者

strcpy(buff,name);

strcat(buff,"\tjoin in\0");

for(i=0;iif(connfd[i]!=-1)

} //接受當前使用者的資訊並將其**給所有的使用者

while(1)

ticks=time(null);

sprintf(buff2,"%.24s\r\n",ctime(&ticks));

#include

#include

#include

#include

#include

#define listenq 5

#define maxline 512

#define maxmem 10

#define namelen 20

int listenfd,connfd[maxmem];//分別記錄伺服器端的套接字與連線的多個客戶端的套接字

void quit();//伺服器關閉函式

void rcv_snd(int n);//伺服器接收並**訊息函式

int main()

//呼叫bind函式使得伺服器端的套接字與位址實現繫結

printf("bind...\n");

servaddr.sin_family=af_inet;

servaddr.sin_port=htons(6666);

servaddr.sin_addr.s_addr=htonl(inaddr_any);

if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)

//呼叫listen函式,將乙個主動連線套接字變為被動的傾聽套接字

//在此過程中完成tcp的三次握手連線

printf("listening...\n");

listen(listenfd,listenq);

//建立乙個執行緒,對伺服器程式進行管理(關閉)

pthread_create(&thread,null,(void*)(&quit),null);

//記錄空閒的客戶端的套接字描述符(-1為空閒)

int i=0;

for(i=0;i1;

} while(1)

} //呼叫accept從listen接受的連線佇列中取得乙個連線

connfd[i]=accept(listenfd,(struct sockaddr*)&cliaddr,&len);

ticks=time(null);

sprintf(buff,"% .24s \r \n",ctime(&ticks));

printf("%s connect from: %s,port %d\n\n",buff,inet_ntoa(cliaddr.sin_addr.s_addr),ntohs(cliaddr.sin_port));

//針對當前套接字建立乙個執行緒,對當前套接字的訊息進行處理

pthread_create(malloc(sizeof(pthread_t)),null,(void*)(&rcv_snd),(void*)i);

} return

0;

} void quit()

} } void rcv_snd(int n)

//把當前使用者的加入告知所有使用者

strcpy(buff,name);

strcat(buff,"\tjoin in\0");

for(i=0;iif(connfd[i]!=-1)

} //接受當前使用者的資訊並將其**給所有的使用者

while(1)

ticks=time(null);

sprintf(buff2,"%.24s\r\n",ctime(&ticks));

strcpy(buff,name);  

strcat(buff,"\t");

strcat(buff,buff2);

strcat(buff,buff1);

for(i=0;i

} }

}

C Socket編寫區域網聊天室(伺服器端)

需要的引用包括 using system.net using system.net.sockets using system.threading 首先要建立socket,將其繫結到本機的ip位址,給它乙個埠號。然後開始監聽 什麼是ip位址和埠號?每乙個計算機都有乙個ip位址。通過ip位址可以在網路中...

多執行緒伺服器端的實現

1.單cpu系統中如何同時執行多個程序?請解釋該過程中發生的上下文切換。答 只有1個cpu cpu的運算裝置core 的系統中不是也可以同時執行多個程序嗎?只是因為系統將cpu時間分成了多個微小的塊後分配給了多個程序。為了分時使用cpu,需要 上下文切換 的過程。2.為何執行緒上下文切換更快?執行緒...

多執行緒聊天室的實現 C

使用mfc進行網路程式設計,實現多執行緒聊天室 1.mfc網路程式設計要包含庫檔案 include 可以在stdafx.h中包含此檔案 以下是主要 實現部分 1.首先編寫初始化套接字的函式 名稱 initstocket 功能 初始化套接字 bool cudpchatdlg initsocket so...