免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 836 | 回复: 0
打印 上一主题 下一主题

UNIX网络编程 读书笔记 by qb 5 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-26 13:14 |只看该作者 |倒序浏览
下面开始的这个程序就有点长了,要有耐心,FIFO。
FIFO、pipo一个有名一个无名,但是真正的FIFO的优势表现在服务器可以是长期运行的进程(守护进程),而且与客户没有亲缘关系,作为服务器的首富进程以某个众所周知的路径名创建一个FIFO,并打开该FIFO来读。此后某个时刻,客户启动FIFO来写,并将其命令或者给守护进程的其他任何东西通过该FIFO发送出去,这种形式的单向通信用FIFO很容易实现,但是如果守护进程需要向客户发送回一些东西,就必须使用一些技巧了,这里进程id对与每一个进程都是唯一的,所以我们对进程id进行封包,在解析包的时候把进程id解释出来,再以该id封包,返回给客户,由于id的唯一性,我们就可以实现是双向通信了。只是我们要实现一个所谓的协议。
下面是我们的server的源代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXLINE 1024
#define SERV_FIFO "/tmp/serv.fifo"
ssize_t readline(int fd, void *vptr, size_t maxlen)
{
ssize_t n, rc;
char c, *ptr;
ptr = vptr;
for (n = 1; n  0) {
  if (buff[n-1] == '\n')
   n--;   /* delete newline from readline() */
  buff[n] = '\0';  /* null terminate pathname */
  if ( (ptr = strchr(buff, ' ')) == NULL) {
   printf("bogus request: %s\n", buff);
   continue;
  }
  *ptr++ = 0;   /* null terminate PID, ptr = pathname */
  pid = atol(buff);
  snprintf(fifoname, sizeof(fifoname), "/tmp/fifo.%ld", (long) pid);
  if ( (writefifo = open(fifoname, O_WRONLY, 0))  0)
    write(writefifo, buff, n);
   close(fd);
   close(writefifo);
  }
}
}
void server(int readfd,int writefd)
{
size_t len;
ssize_t n;
int fd;
char buff[MAXLINE+1];
if((n=read(readfd,buff,MAXLINE))==0)
{
  printf("error in read\n");
  exit(0);
}
buff[n]='\0';
if((fd= open(buff,O_RDONLY))0)
   write(writefd,buff,n);
  close(fd);
}
}
//END      
      如果您真的要copy我的程序,那么这上面的别的程序你应该也是放在同一个目录下面,如果你把文件名存为mainserver的时候,建议在编译时采取如下方式:
        gcc mainsever.c -o mainserver
以下是客户端的程序:
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXLINE 1024
#define SERV_FIFO "/tmp/serv.fifo"
int main(int argc, char **argv)
{
int  readfifo, writefifo;
size_t len;
ssize_t n;
char *ptr, fifoname[MAXLINE], buff[MAXLINE];
pid_t pid;
  /* 4create FIFO with our PID as part of name */
pid = getpid();
snprintf(fifoname, sizeof(fifoname), "/tmp/fifo.%ld", (long) pid);
printf("%d",(long)pid);
if ((mkfifo(fifoname, 0666)  0)
  write(STDOUT_FILENO, buff, n);
close(readfifo);
unlink(fifoname);
exit(0);
}//END
如果您把他存为mainclient,同样编译的时候通过该种方式:cc mainclient.c -o mainclent
   在/tmp文件夹下面创建,abc,内容为abcasdfasdfa,创建的方式多种,vim 。。。。
命令行方式:vim abc
此时打开了一个新的页面,
abcasdfasdfa
:wq
保存.
  最后一步应该是测试通过的过程了,先打开两个终端,在目标目录下:先启用服务器:./mainserver
在另外一个终端下面启动客户端:./mainclient
继续在客户端输入:/tmp/abc
得到结果:abcasdfasdfa
程序结束。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/83146/showart_1335534.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP