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

运行命令

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. dubbo consumer 端口_初识Dubbo
  2. 医改大背景下的第三方检验行业发展趋势
  3. 去掉字符串连续出现K个0的子串
  4. 【转】ubuntu 下 VNCview 远程桌面无法传输文件问题
  5. ROS : 修改ROS源代码(overlaying package)
  6. 索尼Xperia 2带壳渲染图曝光:外形依然很索尼
  7. anaconda python no module named ‘past‘的解决方法
  8. 测试开发面试题汇总(自用)
  9. http工作原理和机制
  10. 【Adobe Premiere Pro 2020】ps图稿导出到pr创建运动图形、pr音频录制与音频效果使用说明、pr导出为mp4格式及参数设置说明【包含其他几种常见格式】、pr去水印的4种方法说明
  11. 面试官问“你还有什么需要了解的吗”——应该这样回答
  12. 每周写周报每天写总结
  13. 致远互联发布A6+在打什么牌?
  14. 可视化接口管理平台 YApi,让你轻松搞定 API 的管理问题
  15. 19.1 快速幂的定义和模板
  16. mysql存储过程while循环语句
  17. Android 更换开机logo和开机动画
  18. 【TypeScript 专题】之 Ts 中的类(class)
  19. Oracle Database SQL Language Reference 笔记(3)—— 伪列(续)
  20. ❥关于C++之函数指针函数对象

热门文章

  1. 图解前端之正则表达式
  2. Mac Automator小教程,简单易懂
  3. 来自平时工作中的css知识的积累---持续补充中
  4. 数据库使用1--注意事项
  5. 数据库系统工程师输给了计算机等级考试二级
  6. 本质矩阵 基础矩阵 单应矩阵 (3)
  7. SEH in ASM研究
  8. samba - 为 UNIX 实现的 Windows SMB/CIFS 文件服务器
  9. jQuery创建、删除和修改html标签
  10. 关于面试,关于大学——大四狗的自述