簡單高併發C S模型

2021-07-25 16:17:41 字數 4910 閱讀 2281

使用了自己做的通用api函式庫,參考之前的文章:

網路程式設計中的select實現超時檢測和通用api

多程序+共享記憶體+訊號量綜合例項

客戶端

#include "comsocket.h"

#include

void handle(int signum) }

int main()

; int datalen = 10;

int outlen = 1024;

int con_fd;

int i,j;

int proc_num,loop_num;

pid_t pid;

printf("input the procnum:\n");

scanf("%d",&proc_num);

printf("input the loop_num:\n");

scanf("%d",&loop_num);

signal(sigpipe,sig_ign);

signal(sigchld, handle);

//客戶端環境初始化

ret = sckclient_init(&handle,5,5,5,1);

for(i = 0;i < proc_num;i++)

break;

}//客戶端端接受報文

ret = sckclient_rcv(handle,con_fd,out, &outlen);

if (ret != 0)

break;

}out[outlen] = '\0';

printf("data: %s \nlen: %d\n", out,outlen);

}close(con_fd);

exit(0);//避免產生孫子程序

}} // 客戶端環境釋放

sckclient_destroy(&handle);

while ((pid = waitpid(-1, null, wnohang) ) >= 0)//返回0的話,表示子程序並沒有真結束完畢,知道返回-1才退出收屍過程,結束父程序。

printf("child over pid %d \n", pid);

fflush(stdout);

return ret;

}

伺服器

#include "comsocket.h"

#include

#define port 8001

#include "myipc_sem.h"

#include "myipc_shm.h"

void chld_handle(int sig)

int srv_init()

//利用獲取的key開啟/建立訊號量集合

key = ftok("./",'a');

//建立訊號量集合--預設建立1個訊號量

//儘管子程序再次呼叫該部分**--表面上重新建立訊號量

//但由於key相同,系統裡面已經有父程序建立的訊號量,所以他們是同乙個訊號量集合

//原理和父子程序建立共享記憶體一樣

ret = sem_open(key, &semid);

if(ret == semerr_enoxist)

}int val= 1;

ret = sem_set(semid, val);//設定訊號量計數值--預設設定第1個,下標位0

if(ret == -1)

ret = sem_get(semid, &val);//獲取訊號量計數值

if(ret != 0)

printf("val:%d\n",val);

return0;}

void test()

} sem_p(semid);//p操作

ret = ipc_creatshm("./", sizeof(int), &shmdl);

if(ret != 0)

ret = ipc_mapshm(shmdl,(void**)&addr);

cnt = ++(*addr);

printf("cnt:%d\n",cnt);

ret = ipc_unmapshm(addr);//顯示解除對映關係

sem_v(semid);//v操作

}int main()

; pid_t pid;

signal(sigchld,chld_handle);

signal(sigpipe,sig_ign);

srv_init();

ret = sckserver_init(port, &listenfd);

if(ret != 0)

printf("waiting for connect.....\n");

while(1)

pid = fork();

if(pid == -1)

else

if(pid == 0)

recv[datalen] = '\0';

printf("rcv:%s\n***************===\n",recv);

test();

//伺服器端傳送報文

ret = sckserver_send(con_fd,recv, datalen, timeout);

if(ret != 0)

}close(con_fd);

exit(ret);

}else

if(pid > 0)

} //伺服器端環境釋放

//ret = sckserver_destroy(void **handle);

return

0;}

客戶端

和多程序版本的一樣,也可以寫成多執行緒版本的!

伺服器

#include "comsocket.h"

#include

#define port 8001

#include "myipc_sem.h"

#include "myipc_shm.h"

#include

void chld_handle(int sig)

int srv_init()

//利用獲取的key開啟/建立訊號量集合

key = ftok("./",'a');

//建立訊號量集合--預設建立1個訊號量

//儘管子程序再次呼叫該部分**--表面上重新建立訊號量

//但由於key相同,系統裡面已經有父程序建立的訊號量,所以他們是同乙個訊號量集合

//原理和父子程序建立共享記憶體一樣

ret = sem_open(key, &semid);

if(ret == semerr_enoxist)

}int val= 1;

ret = sem_set(semid, val);//設定訊號量計數值--預設設定第1個,下標位0

if(ret == -1)

ret = sem_get(semid, &val);//獲取訊號量計數值

if(ret != 0)

printf("val:%d\n",val);

return0;}

void test()

} sem_p(semid);//p操作

ret = ipc_creatshm("./", sizeof(int), &shmdl);

if(ret != 0)

ret = ipc_mapshm(shmdl,(void**)&addr);

cnt = ++(*addr);

printf("cnt:%d\n",cnt);

ret = ipc_unmapshm(addr);//顯示解除對映關係

sem_v(semid);//v操作

}#define time_out 5

void* threadroute(void* var)

; int datalen = 1024;

int timeout = time_out;

int ret = 0;

pthread_detach(pthread_self());

if(var == null)

con_fd = *((int*)var);

free(var);

while(1)

printf("sckserver_rcv err: %d\n",ret);

break;

}recv[datalen] = '\0';

printf("rcv:%s\n***************===\n",recv);

test();

//伺服器端傳送報文

ret = sckserver_send(con_fd,recv, datalen, timeout);

if(ret != 0)

} close(con_fd);

return null;

}int main()

printf("waiting for connect.....\n");

while(1)

int *pcon = (int*)malloc(sizeof(int));

*pcon = con_fd;

//pthread_t *ptr_tid = (pthread_t*)malloc(sizeof(pthread_t));

pthread_create(&tid, null, threadroute, (void*)pcon);

//close(con_fd);

} return

0;}

當然還可以使用」基於select+多執行緒+互斥鎖+共享記憶體」的模式,將pv操作修改為加解鎖即可!

Linux簡單高併發模型 Epoll 執行緒池

首先是乙個locker.h的檔案,封裝了訊號量 互斥量 條件變數。locker.h檔案 ifndef locker h define locker h include include include 訊號量的類 class sem locker 銷毀訊號量 sem locker 等待訊號量 bool...

tomcat高併發apr io模型

linux上配置tomcat apr高併發io模型 前情 本人的開發環境 centos7,tomcat8.0.44,jdk1.7.0 79 安裝apr遇到問題 tomcat8.044 需要openssl1.02以上版本 準備條件 必須有網路 安裝gcc gcc 環境 安裝openssl的庫 安裝ap...

C S模型和B S模型

首先了解一下c s和b s模型,b s模型是特殊的c s模型。非對等相互作用,伺服器有客戶端不具備的硬體和軟體資源 運算能力,伺服器提供服務,客戶請求服務。多個客戶程序可以同時訪問乙個服務程序,乙個客戶程序可以同時訪問多個伺服器提供的服務。客戶端和伺服器執行在同乙個機器上,應用於網路應用程式開發測試...