AF_UNIX域通信(基于socket和pipe的通信,只适于UNIX系统S&C同在一个主机上,用于进程通信)

服务器端:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stddef.h>
char buf[100];
void main(void)
{int sersock,cltsock;
 int len,clen;
 int ret=0;
 struct sockaddr_un seraddr,cltaddr;
 sersock=socket(AF_UNIX,SOCK_STREAM,0);
 if(sersock<0)  {return ;}
 memset(&seraddr,0,sizeof(seraddr));
 seraddr.sun_family=AF_UNIX;
 sprintf(seraddr.sun_path,"ser");
 unlink(seraddr.sun_path);
 len = offsetof(struct sockaddr_un, sun_path) + strlen(seraddr.sun_path);
 if (0 > bind(sersock, (struct sockaddr *)&seraddr, sizeof(struct sockaddr)) ||      //
        0 > listen(sersock, 10))
        {printf("fail to bind and lisen \n");}
     printf("Start to listen connect request from unix socket name: \"%s\"\n", seraddr.sun_path);
while(1)
{ clen=sizeof(cltaddr);
  cltsock=accept(sersock,(struct sockaddr*)&cltaddr,&clen);
  if(0>cltsock)
   {printf("ACCEPT  error\n");}
  clen -= offsetof(struct sockaddr_un, sun_path);
  cltaddr.sun_path[clen] = 0;
        while(1)
        {
         ret = recv(cltsock,buf,100, 0);
         buf[ret]=0;
         printf(buf);
         if (ret != send(cltsock, buf,ret, 0))
            {printf("AgentSrv send message fail\n");}
        } 
}
close(cltsock);
close(sersock);
}

客户端:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stddef.h>
char buf[100];
void main(void)
{
    int cltsock, len, err;
    struct sockaddr_un cltaddr;
    struct sockaddr_un seraddr;
  int ret;
    cltsock = socket(AF_UNIX, SOCK_STREAM, 0);
    if (cltsock < 0)
    {
     printf("socket creat error !!!\n");
      return;
    }
    memset(&cltaddr, 0, sizeof(cltaddr));
    cltaddr.sun_family = AF_UNIX;
    sprintf(cltaddr.sun_path, "clt");
    len = offsetof(struct sockaddr_un, sun_path) + strlen(cltaddr.sun_path);
    unlink(cltaddr.sun_path); //若已存在,先删除之
    if (bind(cltsock, (struct sockaddr *)&cltaddr, sizeof(struct sockaddr)) < 0)  //绑定之后才能建立文件路劲
    {
        printf("Bind socket to addr fail\n");
        close(cltsock);
        return;
    }
   
 /*   if(chmod(cltaddr.sun_path, S_IRWXU) < 0)     //修改文件权限:可以不需要
    {
        printf("Set %s rwx for user only fail\n", cltaddr.sun_path);
        return;
    }
*/
    //设置服务端地址
    memset((char*)&seraddr, 0, sizeof(seraddr));
    seraddr.sun_family = AF_UNIX;
    strcpy(seraddr.sun_path, "ser");
    len = offsetof(struct sockaddr_un, sun_path) + strlen("ser");
    //以客户端socket连接服务端地址
    if (connect(cltsock, (struct sockaddr *)&seraddr, len) < 0)
    {
        printf("Connect agent sock \"%s\" fail\n", "ser");
        return;
    }
    while(1)
    {printf("input a line:");
     gets(buf);
     len=strlen(buf);
     printf("\nsend cnt:%d\n",len);
     if (len != send(cltsock, buf, len, 0))
   {
    printf("Send msg fail\n");
    return ;
   }
   ret = recv(cltsock,buf,100, 0);
         buf[ret]=0;
         printf("\nreceived: %s\n",buf);
    }
    close(cltsock);
}

AF_UNIX域通信(基于socket和pipe的通信,只适于UNIX系统S&C同在一个主机上,用于进程通信)

时间: 2025-01-02 14:39:50

AF_UNIX域通信(基于socket和pipe的通信,只适于UNIX系统S&C同在一个主机上,用于进程通信)的相关文章

基于MFC设计的MINI快跑游戏(游戏开发、MFC精讲、线程与进程通信)

课程讲师:今夜有风    课程分类:游戏开发    适合人群:初级    课时数量:36课时    更新程度:完成    服务类型:C类(普通服务类课程)    用到技术:MFC    涉及项目:MINI快跑游戏 给各位网友分享一套课程,有兴趣的可以加我 2748165793 一.项目简单介绍 MFC简介: MFC实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎.VC++是Windows下开发人员使用的专业C++ SDK(SDK,Standard SoftWare Develo

细说linux IPC(一):基于socket的进程间通信(上)

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途] 在一个较大的工程当中,一般都会有多个进程构成,各个功能是一个独立的进程在运行.既然多个进程构成一个工程,那么多个进程之间肯定会存在一些信息交换或共享数据,这就涉及到进程间通信.进程间通道有很多种,比如有最熟悉网络编程中的socket.还有共享内存.消息队列.信号.管道等很多方式,每一种方式都有自己的适用情况,在本系列文章中笔者将会对多种进程间通

基于socket的简单网络程序设计

基于socket的简单网络程序设计 1.实验目的与要求: (1)初步掌握TCP和UDP方式的网络编程模式. (2)能运用Winsock提供的API函数接口进行网络程序的编写. 2.实验准备和说明: (1)要求掌握流式和数据报socket的编程模式和实现. (2)创建本次实验工作文件夹"-\实验\实验4". 3.实验内容与步骤:       1)工程的创建 在VC6里边新建一个工程,选择:Win32 Console Application,输入工程名.具体方法:启动VC6.0,进入[文件

linux 单机跨进程通信

一般来说通过网络通信(比如tcp,udp)或者共享内存的方式肯定可以实现跨进程通信,但现在这里要说的是比较偏但实用的几个方法:利用unix域通信(普通网络连接),利用unix域通信(socketpair通信),以及pipe方式. 一. 利用unix域通信(普通网络连接) socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.

Qt的内部进程通信机制 [转]

Qt 作为一种跨平台的基于 C++ 的 GUI系统,能够提供给用户构造图形用户界面的强大功能.自从 1996 年 Qt 被 Trolltech公司发布以来,该系统成为世界上很多成功的图形用户应用所使用的主要系统.更为重要的是,Linux 操作系统的桌面环境系统 KDE 也是基于 Qt构造的.目前,Qt 已经提供了对包括 MS/Windows.Unix/X11 和嵌入式平台的支持,得到了越来越广泛的应用. 在 Qt 系统中,不仅有着构造完善的系统结构,而且为了满足用户对编写图形用户界面应用的种种需

Linux/Unix系统编程手册--SOCKET章节读书笔记

SOCKET章节读书笔记 强烈推荐Linux/Unix系统编程手册,号称超越APUE的神书. backlog含义 #include <sys/socket.h> int listen(int socketfd, int backlog) backlog参数限制未决连接(未accept)的数量,在这个数量之内,connect会立刻成功. Linux上上限为128,定义在 udp已连接socket udp socket也是可以调用connect()的,这种叫已连接socket,内核会记录这个soc

有名管道进程通信

一.任务 1.学习mkfifo等函数: 2.了解有名管道的特点.阻塞打开与非阻塞打开等: 3.编写一个关于有名管道进程通信的程序,并运行. 二.相关概念 1.相关函数 创建有名管道的函数是mkfifo,函数原型是: int mkfifo (const char *__path, __mode_t __mode) 功能:创建新的带命名路径的FIFO 参数:path - 命名管道路径 mode - 模式权限 返回值:成功返回0,失败返回-1: 2.有名管道的特点 a).使不同进程之间完成通信. 通过

一起talk C栗子吧(第一百五十七回:C语言实例--基于AF_UNIX域的数据报套接字通信)

各位看官们,大家好,上一回中咱们说的是基于AF_UNIX域的流套接字通信的例子,这一回咱们说的例子是:基于AF_UNIX域的数据报套接字通信 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回中一起制作了我们的第一道佳肴是:基于AF_UNIX域的流套接字通信.今天,我将和大家一起制作第二道佳肴:基于AF_UNIX域的数据报套接字通信. 制作第二道佳肴的菜谱:数据报套接字过程. 制作第二道佳肴的食材:数据报套接字的接口,套接字属性,套接字地址信息. 看官们,以上的内容,我们

一起talk C栗子吧(第一百五十六回:C语言实例--基于AF_UNIX域的流套接字通信)

各位看官们,大家好,上一回中咱们说的获取socket通信地址的例子,这一回咱们说的例子是:基于AF_UNIX域的流套接字通信 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前面章回中介绍了套接字的通信过程以及套接字的的细节,总感觉还缺少些什么,一时还真是想不起来.这好比我们有了食谱也有了食材,那么我们就可以做一道美味的佳肴了.啊!有了.一提到美味的佳肴,灵感就来了.我们缺少的是对套接字的综合演练,也就是把前面章回中知识串在一起,然后举一个综合使用套接字知识进行套接字通信的例