基于IPC的echo server
来源:互联网 发布:绣花软件哪个好 编辑:程序博客网 时间:2024/04/29 09:57
Linux下使用共享内存和信号量来实现一个echo server。对共享内存的操作使用信号量来控制,类似于生产者和消费者的问题。下面附上server端和client端的代码。
Server.c
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <assert.h>
#define MYSHM "myshm"
#define SEM_S "sem_s"
#define SEM_C "sem_c"
#define BUF_SIZE 200
typedef struct mydata {
int flag;
char buf[BUF_SIZE];
}mydata;
int main(int argc, char *argv[])
{
int shm_key;
int shm_id;
char name[50];
mydata *pdata;
char *ptr;
sem_t *sem_s, *sem_c;
strcpy(name, MYSHM);
shm_key = ftok(name, 0);
if (shm_key == -1)
{
perror("ftok error");
return -1;
}
shm_id = shmget(shm_key, sizeof(mydata), IPC_CREAT);
if (-1 == shm_id)
{
perror("shmget error.");
return -1;
}
ptr = shmat(shm_id, NULL, 0);
if ((char *)-1 == ptr)
{
perror("shmat error.");
return -1;
}
sem_s = sem_open(SEM_S, O_CREAT, 0644, 1);
if (sem_s == NULL)
perror("sem_open error.");
assert(sem_s != NULL);
int r1 = sem_init(sem_s, 1, 0);
assert(r1 == 0);
sem_c = sem_open(SEM_C, O_CREAT, 0644, 1);
assert(sem_c != NULL);
int r2 = sem_init(sem_c, 1, 0);
assert(r2 == 0);
pdata = (mydata *)ptr;
while (1)
{
//while (!pdata->flag);
sem_wait(sem_c);
pdata->flag = 0;
sem_post(sem_s);
}
shmdt(ptr);
return 0;
}
Client.c
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/shm.h>
#include <semaphore.h>
#include <assert.h>
#define MYSHM "myshm"
#define SEM_S "sem_s"
#define SEM_C "sem_c"
#define BUF_SIZE 200
typedef struct mydata {
int flag;
char buf[BUF_SIZE];
}mydata;
int main(int argc, char *argv[])
{
int shm_key;
int shm_id;
char name[50];
mydata *pdata;
char *ptr;
sem_t *sem_s, *sem_c;
strcpy(name, MYSHM);
shm_key = ftok(name, 0);
if (shm_key == -1)
{
perror("ftok error");
return -1;
}
shm_id = shmget(shm_key, sizeof(mydata), IPC_CREAT);
if (-1 == shm_id)
{
perror("shmget error.");
return -1;
}
ptr = shmat(shm_id, NULL, 0);
if ((char *)-1 == ptr)
{
perror("shmat error.");
return -1;
}
sem_s = sem_open(SEM_S, O_CREAT, 0644, 1);
assert(sem_s != NULL);
int r1 = sem_init(sem_s, 1, 0);
assert(r1 == 0);
sem_c = sem_open(SEM_C, O_CREAT, 0644, 1);
assert(sem_c != NULL);
int r2 = sem_init(sem_c, 1, 0);
assert(r2 == 0);
pdata = (mydata *)ptr;
while (1)
{
fgets(pdata->buf, BUF_SIZE, stdin);
pdata->flag = 1;
//while (pdata->flag);
sem_post(sem_c);
sem_wait(sem_s);
printf("%s", pdata->buf);
}
shmdt(ptr);
return 0;
}
Makefile
all:
gcc -g -Wall ipc_echo_server.c -o ipc_echo_server -lpthread
gcc -g -Wall ipc_echo_client.c -o ipc_echo_client -lpthread
clean:
rm -f ipc_echo_server ipc_echo_client
- 基于IPC的echo server
- 基于libuv的TCP echo-server
- 基于select模型的python echo server
- 简单的echo server
- 基于TCP的ECHO程序
- ACE Reactor的Echo Server
- 最精简的echo server
- 【slighttpd】基于lighttpd架构的Server项目实战(4)—简单的echo服务器
- python实现-恒定数量进程池的echo server模型 基于multiprocessing
- Echo server
- ECHO Server
- echo server
- 基于UDP的ECHO控制台程序
- 基于echo例子的netty4通信总结
- 基于boost.asio的ECHO服务器
- 基于boost.asio的echo服务器2
- 基于boost.asio的echo服务器3
- 基于echo例子的netty4通信总结
- 滤除音频文件背景噪声
- Language Type
- PHP魔术方法
- 使用OpenSSL建立CA
- Js 单元测试框架介绍
- 基于IPC的echo server
- mac快捷键
- Spring MVC核心功能探秘
- 设计模式 外观(Facade)模式
- 让debian面板上的天气可用。
- hdu 2768 Cat vs. Dog (最大独立)
- ObReferenceObjectByName 函数
- 拷贝文件(c)
- code seg + offset