Linux下c語言TCP多執行緒聊天室

2021-09-26 00:15:54 字數 3122 閱讀 7351

開發環境:linux(ubuntu 12.04),gcc

編譯:

gcc server.c -lpthread -std=gnu99 -o s

gcc client.c -lpthread -std=gnu99 -o c

執行服務端

執行2個客戶端

其中乙個客戶端傳送訊息

互相傳送

整體效果圖

客戶端傳送"quit"斷開連線。

那麼話不多說,放碼過來:

碼雲:傳送門,github:傳送門

服務端:server.c

#include #include #include #include #include #include #include struct sockaddr_in addr = {};

int clifd_index = 0; // clifd的下標

char buf[1024] = {}; // 儲存客戶端發來的字串

char str[1024] = {}; // 儲存帶clifd的回傳資訊

int clifd[30] = {}; // 儲存clifd

int online_num = 0; // 連線人數

int max_num = 10; // 最大人數

// 專案有bug,連線人數的限制控制不住,有待改進

void* start_read(void *arg) // 讀取資訊的子執行緒

; sprintf(id,"%d說:",clifd1);

if(strlen(buf) != 0)

// 存入str中

if(0 == strcmp("quit",buf)) // 如果收到quit

printf("準備位址...\n");

addr.sin_family = af_inet;

addr.sin_port = htons(6008);//埠號

addr.sin_addr.s_addr = inet_addr("127.0.0.1");//你的ip位址(或伺服器的私網ip)

socklen_t len = sizeof(addr);

printf("繫結socket與位址...\n");

if(bind(sockfd,(struct sockaddr*)&addr,len))

printf("設定監聽...\n");

if(listen(sockfd,2))

printf("等待客戶端連線...\n");

for(;;)

; clifd[clifd_index] = accept(sockfd,(struct sockaddr*)&addrcli,&len);

int flag = 0;

for(int i=0; iclifd[clifd_index])

printf("clifd:%d\n",clifd[clifd_index]);

// 建立子執行緒

pthread_t pid1,pid2;

pthread_create(&pid1,null,start_read,&clifd[clifd_index]);

pthread_create(&pid2,null,start_write,&clifd[clifd_index]);

usleep(1000);

// printf("clifd:%d\n",clifd[index]);

clifd_index++; // 下標逐漸+1,這樣寫不是很合適

} return 0;

}

客戶端:client.c

#include #include #include #include #include void* start_read(void* arg) // 讀取資訊

; for(;;) }

}int main()

printf("準備位址...\n");

struct sockaddr_in addr = {};

addr.sin_family = af_inet;

addr.sin_port = htons(6008);//設定的埠號

addr.sin_addr.s_addr = inet_addr("127.0.0.1");//你的ip位址(或伺服器的公網ip)

socklen_t len = sizeof(addr);

printf("繫結連線伺服器...\n");

if(connect(sockfd,(struct sockaddr*)&addr,len))

char link[50] = {};

read(sockfd,link,sizeof(link));

// printf("link:%s\n",link);

if(strstr(link,"您已經成功連線")==null)

else

// 建立讀取子執行緒

pthread_t pid;

pthread_create(&pid,null,start_read,&sockfd);

for(;;)

; usleep(1000);

//printf(">我說:");

gets(buf);

write(sockfd,buf,strlen(buf)+1);

if(0 == strcmp("quit",buf))

}close(sockfd);

}

Linux下C語言多執行緒例項

建立兩個執行緒訪問互斥資料,對其加1輸出。這是乙個多執行緒最常見的例子 include include include include define max 10 pthread t thread 2 pthread mutex t mut int number 0,i void thread1 p...

linux下C語言多執行緒程式設計

include include include include define max 10pthread t thread 2 pthread mutex t mut int number 0 i void thread1 printf thread1 主函式在等我完成任務嗎?n pthread e...

多執行緒程式設計 c語言linux下

適用與linux系統 1.了解基本概念 程序 是計算機所執行的乙個任務的描述,是面向作業系統的最小單位,作業系統能執行很多程序 執行自己寫的乙份 程式,就是讓作業系統執行乙個自己程式的程序 作業系統會根據程式分配定量的資源 執行緒 面想程式 程序 的,把乙個程式分成多個執行緒可以實現並髮式,多工執行...