開發環境: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.了解基本概念 程序 是計算機所執行的乙個任務的描述,是面向作業系統的最小單位,作業系統能執行很多程序 執行自己寫的乙份 程式,就是讓作業系統執行乙個自己程式的程序 作業系統會根據程式分配定量的資源 執行緒 面想程式 程序 的,把乙個程式分成多個執行緒可以實現並髮式,多工執行...