資源簡介
用C語言編程實現linux簡單的聊天室功能。
? 用戶程序命名為client.c;服務器程序命名為server.c
? 綁定端口等信息見實驗方法內容;
? 要求client可以通過socket連接server
? 在client,提示輸入服務器ip
? 若連接server 的socket建立成功,返回提示信息
? Client輸入的聊天內容在client端(多個client端)和server端同時顯示;
? 多個client可同時接入server,進入聊天室,最多支持20個client;
? Client端輸入quit退出連接,server端提示client退出。
? 可選擇使用多線程實現多客戶端;

代碼片段和文件信息
/*******?服務器程序(server.c)?************/
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
//#include?
typedef?unsigned?long?int?pthread_t;
#define?MAXLINE?1000//在一條消息中最大的輸出字符數
#define?LISTENQ?20//最大監聽隊列
#define?PORT?5000//監聽端口
#define?MAXFD?20//最大的在線用戶數量
void?*get_client(void?*);
int??sockfdi;
static?int??maxi=0;//maxi表示當前client數組中最大的用戶的i值
static?int??client[MAXFD];
void?recvandsend(void)//監聽轉發線程入口函數
{
int??index=0;
int??nbytes=0;
char?buffer[1024];
?int??len;
?int?outindex=0;
?while(1)
?{
if(maxi>0)
{
??memset(buffer0sizeof(buffer));
??nbytes=0;???
??//index++;?
??nbytes=read(client[index++]buffersizeof(buffer));
//??printf(“%d%d\n“indexclient[index]);?
??if(nbytes>0)
??{
???buffer[nbytes]=‘\0‘;
???printf(“%s\n“buffer);
???outindex=0;
???while(outindex {
?????if(write(client[outindex++]buffersizeof(buffer))==-1)
?????{
??????fprintf(stderr“WriteError:%s\n“strerror(errno));
??????exit(1);
?????}
}
??}
?}
?if(index>=maxi)
index=0;
?}
?pthread_exit(NULL);
}
?
int??main(int??argc?char??*argv[])
{
//??int?client_fd[LISTENQ]clientnum=0;;
?struct?sockaddr_in?server_addr;
?struct?sockaddr_in?client_addr;
?int?sin_sizeportnumber;
?char?hello[]=“Hello!?Are?You?Fine?\n“;
?int???thr_id;??/*?thread?ID?for?the?newly?createdthread?*/
?pthread_t??p_thread;?/*?thread‘s?struct?ure??*/
?int??new_fd=0;
?memset(client0sizeof(client));
?if(argc!=1)
?{
?fprintf(stderr“Usage:%sportnumber\a\n“argv[0]);
?exit(1);
?}
?
?/*?服務器端開始建立?socket?描述符?*/
?if((sockfd=socket(AF_INETSOCK_STREAM0))==-1)
?{
?fprintf(stderr“Socketerror:%s\n\a“strerror(errno));
?exit(1);
?}
?/*?服務器端填充?sockaddr?結構?*/
?bzero(&server_addrsizeof(struct?sockaddr_in));
?server_addr.sin_family=AF_INET;
?server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
?server_addr.sin_port=htons(PORT);
?/*?捆綁?sockfd?描述符?*/
?if(bind(sockfd(struct?sockaddr?*)(&server_addr)sizeof(struct??sockaddr))==-1)
?{
?fprintf(stderr“Binderror:%s\n\a“strerror(errno));
?exit(1);
?}
?printf(“服務器監聽端口%d...\n“PORT);
?/*?監聽?sockfd?描述符?*/
?if(listen(sockfdLISTENQ)==-1)
?{
?fprintf(stderr“Listenerror:%s\n\a“strerror(errno));
?exit(1);
?}
?thr_id?=pthread_create(&p_thread?NULL?recvandsend?NULL);
?printf(“歡迎來到本聊天室\n“);
?while(1)
?{
?/*?服務器阻塞直到客戶程序建立連接?*/
?if(maxi>=20)
?{
??printf(“以達到人數上線\n“);
??continue;
?}
?sin_size=sizeof(struct?sockaddr_in);
?if((new_fd=accept(sockfd(struct?sockaddr?*)(&client_addr)&sin_size))==-1)
?{
??fprintf(stderr“Accepterror:%s\n\a“strerror(errno));
??exit(1);
?}
?/*fprintf(stderr“Serverget?connection?from?%s\n“inet_ntoa(client_addr.sin_a
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2020-05-07?21:37??LTS\
?????目錄???????????0??2020-05-07?21:36??LTS\fwq\
?????文件??????????79??2020-05-07?21:36??LTS\fwq\Makefile
?????文件????????3389??2020-05-07?21:36??LTS\fwq\server.c
?????文件???????13472??2020-05-07?21:36??LTS\fwq\weserver
?????目錄???????????0??2020-05-07?21:36??LTS\khd\
?????文件????????2587??2020-05-07?21:36??LTS\khd\client.c
?????文件??????????78??2020-05-07?21:36??LTS\khd\Makefile
?????文件???????13512??2020-05-07?21:36??LTS\khd\weclient
?????文件??????295453??2020-05-07?21:33??LTS\聊天室大作業.docx
- 上一篇:鼠標腳本精靈.rar
- 下一篇:基于c++的RSA加密解密程序及源碼
評論
共有 條評論