server.c

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <signal.h>
#include <sys/epoll.h>
#include <errno.h> #define UNIX_DOMAIN "/tmp/UNIX.domain" void handler(){ printf("clean program start\n");
//unlink(UNIX_DOMAIN);
remove(UNIX_DOMAIN);
printf("clean end.\n");
} int main(void)
{
int lsn_fd, apt_fd;
struct sockaddr_un srv_addr;
struct sockaddr_un clt_addr;
socklen_t clt_len;
int ret;
int i;
char recv_buf[];
char send_buf[]; signal(SIGTERM,handler); //create epoll
int epfd,eventfd;
struct epoll_event ev,events[]; epfd = epoll_create(); //create socket to bind local IP and PORT
lsn_fd = socket(AF_UNIX, SOCK_STREAM, );
ev.data.fd = lsn_fd;
ev.events = EPOLLIN|EPOLLET; epoll_ctl(epfd,EPOLL_CTL_ADD,lsn_fd,&ev); if(lsn_fd < )
{
perror("can't create communication socket!");
return ;
} //create local IP and PORT
srv_addr.sun_family = AF_UNIX;
strncpy(srv_addr.sun_path, UNIX_DOMAIN, sizeof(srv_addr.sun_path) - );
//unlink(UNIX_DOMAIN); //bind sockfd and sockaddr
ret = bind(lsn_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
if(ret == -)
{
perror("can't bind local sockaddr!");
close(lsn_fd);
unlink(UNIX_DOMAIN);
return ;
} //listen lsn_fd, try listen 5 ret = listen(lsn_fd, );
if(ret == -)
{
perror("can't listen client connect request");
close(lsn_fd);
unlink(UNIX_DOMAIN); return ;
} clt_len = sizeof(clt_addr);
while()
{
int nfds = epoll_wait(epfd,events,,);
int i=;
for(i=;i<nfds;++i)
{
if(events[i].data.fd == lsn_fd)
{
apt_fd = accept(lsn_fd, (struct sockaddr*)&clt_addr, &clt_len);
if(apt_fd < ){
perror("can't listen client connect request");
close(lsn_fd);
unlink(UNIX_DOMAIN);
return ;
}
char lines[];
sprintf(lines,"server data to client\n");
write(apt_fd, lines, ); ev.data.fd = apt_fd;
ev.events = EPOLLIN|EPOLLET; epoll_ctl(epfd,EPOLL_CTL_ADD,apt_fd,&ev); }
else if (events[i].events & EPOLLIN)
//write数据
{
printf("EPOLLIN\n");
if( (eventfd = events[i].data.fd) < )
continue; int n=,ret= ;
char line[];
if ((ret = read(eventfd,line,)) < ){ if(errno == ECONNRESET){
close(eventfd);
events[i].data.fd = -;
}
else
printf("readline error\n");
}
else if( ret == ){
close(eventfd);
events[i].data.fd = -;
}
else if( ret > )
{
line[ret] = '\0';
printf("%s",line);
while( ( ret = read(eventfd,line,)) >)
{
line[ret] = '\0';
printf("%s",line);
}
printf("\n");
}
}
else if (events[i].events & EPOLLOUT){
//写出的数据,在EPOLLIN处理中设置fd的events为EPOLLOUT|EPOLLET时,即触发该事件
int eventfd = events[i].data.fd;
char line[];
write(eventfd,line,); ev.data.fd = eventfd;
ev.events = EPOLLIN | EPOLLET; epoll_ctl ( epfd, EPOLL_CTL_ADD, eventfd, &ev);
}
}
} close(apt_fd);
close(lsn_fd);
unlink(UNIX_DOMAIN);
return ;
}

client.c

 #include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h> #define UNIX_DOMAIN "/tmp/UNIX.domain" int main(void)
{
int connect_fd;
struct sockaddr_un srv_addr;
char snd_buf[];
char rcv_buf[];
int ret;
int i;
connect_fd = socket(AF_UNIX, SOCK_STREAM, ); if(connect_fd < )
{
perror("client create socket failed");
return ;
}
srv_addr.sun_family = AF_UNIX;
strcpy(srv_addr.sun_path, UNIX_DOMAIN);
ret = connect(connect_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr)); if(ret == -)
{
perror("connect to server failed!");
close(connect_fd);
unlink(UNIX_DOMAIN);
return ;
} memset(rcv_buf, , );
int rcv_num = read(connect_fd, rcv_buf, sizeof(rcv_buf));
printf("receive message from server (%d) :%s\n", rcv_num, rcv_buf); memset(snd_buf, , );
strcpy(snd_buf, "message from client");
printf("sizeof(snd_buf): %d\n", sizeof(snd_buf)); printf("send data to server... ...\n");
for(i = ; i < ; i++)
{
write(connect_fd, snd_buf, sizeof(snd_buf));
}
printf("send end!\n");
close(connect_fd);
return ; }

与网络的socket通信的区别,即socket地址有些区别,其他的一样。

sockaddr_in用于网络的socket通信,sockaddr_un用于本机上的进程之间的通信。

epoll实现linux进程通信的更多相关文章

  1. Linux进程通信----匿名管道

    Linux进程通信中最为简单的方式是匿名管道 匿名管道的创建需要用到pipe函数,pipe函数参数为一个数组表示的文件描述字.这个数组有两个文件描 述字,第一个是用于读数据的文件描述符第二个是用于写数 ...

  2. Linux 进程通信之 ——信号和信号量总结

    如今最经常使用的进程间通信的方式有:信号,信号量,消息队列,共享内存.       所谓进程通信,就是不同进程之间进行一些"接触",这种接触有简单,也有复杂.机制不同,复杂度也不一 ...

  3. Linux进程通信学习总结

    http://blog.csdn.net/xiaoweibeibei/article/details/6552498 SYSV子系统的相关概念   引用标识符:引用标识符是一个整数,表示每一个SYSV ...

  4. Linux进程通信的几种方式总结

    进程通信的目的 数据传输 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据 多个进程想要操作共享数据,一个进程对共享数据 通知事 一个进程需要向另一个或一组进程发 ...

  5. linux进程通信之管道

    1.介绍: 1)同一主机: unix进程通信方式:无名管道,有名管道,信号 system v方式:信号量,消息队列,共享内存 2)网络通信:Socket,RPC 2.管道: 无名管道(PIPE):使用 ...

  6. linux 进程通信之 共享内存

    共享内存是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快的方法.一个进程向共享内存区域写入了数据,共享这个内存区域的全部进程就能够立马看到当中的内容. 关于共享内存使用的API k ...

  7. linux进程通信

    e14: 进程间通信(进程之间发送/接收字符串/结构体): 传统的通信方式: 管道(有名管道 fifo,无名管道 pipe) 信号 signal System V(基于IPC的对象):         ...

  8. linux 进程通信 管道

    1. 管道概述及相关API应用 1.1 管道相关的关键概念 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管 ...

  9. Linux进程通信——管道

    管道(pipe)本质上是一种文件,管道通信本质上是通过读写文件通信,但是管道解决了文件的两个问题:限制管道大小,解决read()调用文件结束问题. 管道一个环形的缓冲区,通过两个进程以生产者/消费者的 ...

随机推荐

  1. hdu 1045 Fire Net(最小覆盖点+构图(缩点))

    http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit:1000MS     Memory Limit:32768KB   ...

  2. mysql kill操作

    KILL语法 KILL [CONNECTION | QUERY] thread_id 每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW PROCESSLIST语句查看哪些线程正在运 ...

  3. 做 fzu oj 1106 题目学到的

    题目如下 这道题的意识就是给一个数问是否可以又阶乘之和构成,而难点主要是在于如果是7的话就是1!+3!,并不是单纯的从1的阶乘开始加,而是没顺序的,所以这题就得用到递归. (大概就是函数自己调用函数自 ...

  4. oracle客户端安装及Plsql devloper连接

    1)安装Oracle 11g 64位 2)安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0)下载instantclient-basic-win ...

  5. 如何用C++语言编程(How to program in C++)

    这几年在公司一直带徒弟,每次必教的内容就是C++.在我看来,C++已经有非常好的教材了(注1),实在没有必要从头教起.自学就可以了,可是结果总是不尽人意. 不想再重复一次"把C++当成一门新 ...

  6. XML与DataSet相互转换,DataSet查询

    以FileShare.Read形式读XML文件: string hotspotXmlStr = string.Empty; try { Stream fileStream = new FileStre ...

  7. Mes首检确认统计的存储过程

    USE [ChiefmesNEW]GO/****** Object: StoredProcedure [dbo].[st_MES_RptInspectFirstCollect] Script Date ...

  8. spring 切面 前置后置通知 环绕通知demo

    环绕通知: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...

  9. Linux下getopt()函数的简单使用

    最近在弄Linux C编程,本科的时候没好好学啊,希望学弟学妹们引以为鉴. 好了,虽然啰嗦了点,但确实是忠告.步入正题: 我们的主角----getopt()函数. 英雄不问出处,getopt()函数的 ...

  10. 六、Linux/UNIX操作命令积累【kill、netstat、df、du】

    在使用Linux/UNIX下,常常会使用文本界面去设置系统或操作系统,作者本人在工作的过程也在不断接触这方面的命令,所以为此特酝酿.准备.開始了本文的编写. 本文主要记录自己平时遇到的一些Linux/ ...