实现多个客户端之间的通信(进程之间的通信),服务器作为中转站,并提示哪个客户端上线

运行命令

mkfifo fifo

gcc server.c -o server

gcc client.c -o client

./server fifo

在开三个终端分别输入./client fifo 表示三个客户端

服务器代码

/*************************************************************************> File Name: server.c> Author: yang> Mail:826123027@qq.com > Created Time: 2014年08月23日 星期六 18:59:46************************************************************************/#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
typedef struct tag{//储存进程信息int s_id;//客户端的进程号int s_fd;//向客户端发送信息的标识符int s_flag;//标记是否在server的队列里面
}USR,*pUSR;
int main(int argc,char *argv[]){int fd_server;USR ulist[1024];memset(ulist,0,sizeof(ulist));int nret;char buf[1024];fd_server=open(argv[1],O_RDONLY);//之前就建好的管道,负责客户端向server发送 三种信息分别为1)在线 2)客户发送的消息 3)下线if(fd_server==-1){perror("error");exit(1);}fd_set bak_set,ready_set;//bak_set先备份一下FD_ZERO(&bak_set);FD_SET(fd_server,&bak_set);struct timeval tm;//间隔时间while(1){tm.tv_sec=0;tm.tv_usec=1000;ready_set=bak_set;nret=select(fd_server+1,&ready_set,NULL,NULL,&tm);//检测进程中有几个向server发送信息if(nret==0)continue;if(FD_ISSET(fd_server,&ready_set)){//检测标识符fd_server是否发送信息memset(buf,0,1024);if(read(fd_server,buf,1024)==0){continue;    }else{if(strncmp(buf,"on",2)==0){//检测穿来的信息是不是上线信息int pid;char pipename[32]="";sscanf(buf+3,"%d",&pid);printf("%d on \n",pid);sprintf(pipename,"%d.fifo",pid);int index;for(index=0;index<1024;index++)if(ulist[index].s_flag==0)break;if(index==1024)printf("full!\n");else{ulist[index].s_flag=1;ulist[index].s_id=pid;ulist[index].s_fd=open(pipename,O_WRONLY);}}else if(strncmp(buf,"off",3)==0){//是不是下线信息int pid;sscanf(buf+3,"%d",&pid);char pipename[32]="";sprintf(pipename,"%d.fifo",pid);printf("%d off\n",pid);int index;for(index=0;index<1024;index++){if(ulist[index].s_id==pid){ulist[index].s_flag=0;ulist[index].s_id=0;close(ulist[index].s_fd);break;}}}else {//其他消息int index;for(index=0;index<1024;index++){if(ulist[index].s_flag==1)write(ulist[index].s_fd,buf,strlen(buf));}}}}}
}

客户端代码

/*************************************************************************> File Name: client.c> Author: yang> Mail:826123027@qq.com > Created Time: 2014年08月23日 星期六 19:54:40************************************************************************/#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
int main(int argc,char *argv[]){char pipename[32]="";int fd_send,fd_recv;sprintf(pipename,"%d.fifo",getpid());if(-1==mkfifo(pipename,0666)){//根据这个名字建管道perror("mkfifo");exit(1);}char msg[1024]="";sprintf(msg,"on %d\n",getpid());fd_send=open(argv[1],O_WRONLY);if(fd_send==-1){perror("open");exit(1);}write(fd_send,msg,strlen(msg));//发送上线信息fd_recv=open(pipename,O_RDONLY);//从这个新管道读if(fd_recv==-1){perror("open client");exit(1);}if(fork()==0){//另开辟进程用来读close(fd_send);while(memset(msg,0,1024),read(fd_recv,msg,1024)>0){printf("msg>>:");write(1,msg,strlen(msg));}close(fd_recv);exit(1);}
//  close()用来写信息while(memset(msg,0,1024),fgets(msg,1024,stdin)!=NULL){write(fd_send,msg,strlen(msg));}memset(msg,0,1024);//发送下线信息sprintf(msg,"off %d\n",getpid());write(fd_send,msg,strlen(msg));close(fd_send);close(fd_recv);wait(NULL);
}

Linux 管道通信 客户端与服务器通信相关推荐

  1. qt与JAVA服务器通信_Qt实现的SSL通信客户端和服务器

    [实例简介] Qt实现的SSL通信客户端和服务器 使用QSslSocket实现加密通信 [实例截图] [核心代码] f3a25e44-604e-4435-9e05-3f6efe57c6b0 └── s ...

  2. Websocket(二)-客户端与服务器通信

    Websocket(二)-客户端与服务器通信 服务端 客户端测试 const WebSocket = require('ws'); const Server = WebSocket.Server; c ...

  3. 输入URL,客户端到服务器通信的过程

    输入URL,客户端到服务器通信全过程 按五层网络协议进行理解: 在主机上: 1.第五层--应用层:DNS解析 2.第四层--传输层:TCP三次握手.四次挥手 3.第三层--网络层:IP层 4.第2.5 ...

  4. Exchange邮件系统客户端与服务器通信常用网络端口

    Exchange邮件系统:客户端与服务器通信常用网络端口 序号 用途 端口 1 未加密的web连接: •互联网日历发布 •Outlook on the web(重定向到443/TCP) •自动发现(4 ...

  5. C++基于TCP/IP简单的客户端、服务器通信程序实例

    本篇文章实现了一个基于TCP 的一个非常简单的客户/服务器通信程序实例.该程序中通讯协议使用的是面向连接的TCP协议SOCK_STREAM, 服务器的ip地址为本地地址即: 127.0.0.1,端口号 ...

  6. java socket5源码_Java利用TCP协议实现客户端与服务器通信【附通信源码】

    进行TCP协议网络程序的编写,关键在于ServerSocket套接字的熟练使用,TCP通信中所有的信息传输都是依托ServerSocket类的输入输出流进行的. TCP协议概念 先来了解一下TCP协议 ...

  7. Python网络编程【客户端与服务器通信】

    一.将数据写在发送语句中[传统方式] server端代码: import socket #服务器端将socket套接字赋给sock套接字 sock=socket.socket(socket.AF_IN ...

  8. 全网疯传!Java利用TCP协议实现客户端与服务器通信【附通信源码

    目录 TCP协议概念 ServerSocket类 服务器端程序 客户端程序 Hello!大家好哇!我是灰小猿! 上一篇博客和大家分享了在网络编程中要注意的基础知识,关于IP.TCP.UDP以及端口和套 ...

  9. Windows网络编程入门:简单的客户端和服务器通信程序调试

    昨日入手Windows网络编程经络这本书,第一章给了Echo客户端和服务器的简单通信实例程序.从小白到入门目测都是比较苦逼,居然想不到怎么来测试结果.什么同时运行啊.分别编译运行啊乱七八糟的想法就开始 ...

  10. qt之TCP/IP通信客户端与服务器自动连接互相传输数据

    一.前言 在开发上位机软件,用的最多的通信就是网络通信,串口通信和USB通信,串口通信相对是最容易的,USB通信在前面的文章中也专门写了一个博客介绍USB HID通信方式,见链接:https://bl ...

最新文章

  1. 金蝶中间件部署报栈溢出_京东618压测时自研中间件暴露出的问题,压测级别数十万/秒...
  2. 学习了Python那么长的世界,有没有玩转过hello word?
  3. mysql也能注册到eureka_为什么我的服务提供者和消费者都注册不到eureka注册中心?...
  4. librosa能量_librosa与python_speech_features
  5. 向数组添加元素 java_java如何向数组里添加元素
  6. 安卓系统挂载NTFS格式硬盘_Mac 读写 NTFS硬盘管理开源工具NTFSTool
  7. python julia go_挑战Python的四个语言:Swift、Go、Julia、R
  8. 微信暗黑模式终于来了!这次微信对苹果认怂了?腾讯张军回应...
  9. java 上传图片后没法立马显示出来_SpringMVC多个文件上传及上传后立即显示图片功能...
  10. spring 事务_极限 Spring (4) Spring 事务
  11. zabbix的trigger
  12. 从完美KL距离推导VAE
  13. nRF24L01无线模块笔记
  14. 美国大选投票系统服务器 在法兰克福,网络投票处理方法,装置及服务器 Internet voting processing method, device and server...
  15. 关于富文本编辑器的图片处理
  16. 云+智能的羊群效应显现,百度用“云智一体”坐定头羊位置
  17. Cython 是什么?为什么会有 Cython?
  18. [leetcode]488. Zuma Game
  19. excel不小心点不保存_小心自己不喜欢的东西
  20. CoppeliaSim添加ROS自定义消息类型

热门文章

  1. Spring.Net学习笔记(二)-数据访问器
  2. 【Xcode】编辑与调试
  3. QQ 静态截图程序模拟实现
  4. ORB-SLAM2-建立双目稠密点云(一)
  5. sklearn中的损失函数
  6. Objective-C GCD深入理解
  7. MAPREDUCER学习笔记
  8. StringBuffer是字符串缓冲区
  9. 永远的动漫,梦想在,就有远方
  10. Spring对字段和集合的注入---依赖注入