UNIX域套接字本地通信即在socket第一个参数中选择AF_LOCAL,socket是BSD提出的一种适用于所有的情况的进程间通信的方式,虽然现在多用于网络通信,但是本机内的进程间通信也是没有问题的,使用socket机制的UNIX域常用在前台进程和后台进程的通信。VS tcp/ip和udp/ip的socket在CS两端使用的读写sockfd函数不同,在UNIX域下,CS两端都使用read()/write()对socket进行读写。

模型

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
//服务器:  socket()              //创建socket
struct sockaddr_in    //准备通信sock文件
bind()                //绑定socket和addr
write()/read()         //进行通信
close()               //关闭socket            //客户端:socket()              //创建socket
//准备通信地址:服务器准备的sock文件
connect()             //链接socket和通信地址
write()/read()         //进行通信
close()               //关闭socket

socket()

//创建网络端点,返回socket文件描述符,失败返回-1设errno
int socket(int domain, int type, int protocol);

domain :协议族(protocol family)(网络通讯(IP)还是本地通讯(xxx.socket))

  • AF_LOCAL本地通讯/AF_UNIX/

type :协议

  • SOCK_STREAM //流式套接字, 实现包括但不限于TCP协议,which is有序,可靠双向面向连接的字节流通信方式
  • SOCK_DGRAM //数据报套接字, 实现包括但不限于UDP协议, which is不可靠,无连接的数据报通信方式

protocol: 特殊协议, 一般给0

准备通信地址:

struct sockaddr{    //主要用于函数的形参类型, 很少定义结构体变量使用, 叫做通用的通信地址类型//$man bindsa_family_t     sa_family;char            sa_data[14];
}
struct sockaddr_un{ //准备本地通信的通信地址   //$man un.hsa_family_t     sun_family;//协议族,就是socket()的domain的AF_LOCALchar            sun_path[];//文件的路径
}

bind()

//把通信地址和socket文件描述符绑定,用在服务器端,成功返回0,失败返回-1设errno
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

sockfd: socket文件的fd(returned by socket())
addr: 需要强制类型转换成socketaddr_un或soketaddr_in, 参见上
addrlen: 通信地址的大小, 使用sizeof();

connect():

//初始化一个socket的连接,用在客户端,成功返回0,失败返回-1设errno
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

sockfd: socket文件的fd(returned by socket())
addr: 需要强制类型转换成socketaddr_un或soketaddr_in, 参见上
addrlen: 通信地址的大小, 使用sizeof();

例子

//UNIX域数据报socket进程间通信
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){//1. create socketint sockfd=socket(AF_LOCAL,SOCK_DGRAM,0);   if(-1==sockfd)perror("socket"),exit(-1);printf("create socket successfully\n");//2. prepare communication addrstruct sockaddr_un addr;addr.sun_family=AF_LOCAL;strcpy(addr.sun_path,"a.sock"); //会自动创建a.sock文件//3. bind socket and addrint res=bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));      //客户端是connect()if(-1==res)perror("bind"),exit(-1);printf("bind successfully\n");//4. communicatechar buf[100]={0};res=read(sockfd,&buf,sizeof(buf));                          //客户端是write()if(-1==res)perror("read"),exit(-1);printf("data sent by client:%s,size is %d\n",buf,sizeof(buf));//5. close socketres=close(sockfd);if(-1==res)perror("close"),exit(-1);printf("close successfully\n");return 0;
}

转载于:https://www.cnblogs.com/xiaojiang1025/p/6032531.html

Linux IPC udp/tcp/UNIX域 socket编程相关推荐

  1. 如何给UNIX域Socket套接字抓包?

    目录 源代码 client.c common.c common.h Makefile server.c undump.sh 测试 源代码 https://github.com/Rtoax/test/t ...

  2. Linux网络-UDP/TCP协议详解

    Linux网络-UDP/TCP协议详解 零.前言 一.UDP协议 二.TCP协议 1.应答机制 2.序号机制 3.超时重传机制 4.连接管理机制 三次握手 四次挥手 5.理解CLOSE_WAIT状态 ...

  3. 基于TCP(面向连接)的Socket编程

    基于TCP(面向连接)的Socket编程 一.客户端: 1.打开一个套接字(Socket); 2.发起连接请求(connect); 3.如果连接成功,则进行数据交换(read.write.send.r ...

  4. tcp java实例_实现了基于TCP的Java Socket编程实例代码

    实现了基于TCP的Java Socket编程,功能很简单:客户端向服务器端输出一名话"connect",服务器端接收输出到控制台并向客户端输出一名话"Hello" ...

  5. java socket 通信协议_java 基于TCP协议的Socket编程和通信

    java 基于 TCP 协议的 Socket 编程和通信 在网络通讯中,第一次主动发起通讯的程序被称作客户 端 (Client) 程序, 简称客户端, 而在第一次通讯中等待连接的 程序被称作服务器端 ...

  6. Linux C : TCP/IP 和 网络编程

    目录 一.IP主机和IP地址 二.IP数据包格式 三.TCP/IP在网络中的数据流 四.套接字编程 4.1 创建套接字 4.2绑定socket和端口号 4.3.UDP 套接字 4.4 TCP 套接字 ...

  7. Linux下基于C/C++的Socket编程基础

    什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程, ...

  8. delphi socket 流的使用_基于TCP协议的Socket编程和通信_单向通信

    1.TCP:单向通信Socket之服务器端 import java.io.BufferedWriter; import java.io.IOException; import java.io.Outp ...

  9. TCP:利用Socket编程技术实现客户端向服务端上传一个图片。

    问题: 利用Socket编程技术实现客户端向服务端上传一个图片的程序. 客户端: import java.io.*; import java.net.Socket;public class clien ...

最新文章

  1. 设置复杂密码为了防范谁? | 每日趣闻
  2. 讲解启动CentOS Samba 服务的方法
  3. Python编程语言学习:包导入和模块搜索路径简介、使用方法之详细攻略
  4. 拦截器---SpringMVC学习笔记(十四)
  5. 图像处理:Canny边缘检测算法原理(一)
  6. 【GIS导论】实验一 桌面GIS的功能与菜单操作
  7. 你知道Thread线程是如何运作的吗?
  8. 软件测试行业用mac好还是win好,为了在Mac上也能用好Windows,我做了这些调整
  9. 拼多多回应漏洞:比薅羊毛更快的是“资损200亿”谣言的传播速度
  10. 请没有买房和买车的朋友一定认真的看一下
  11. 末位淘汰!985高校硕士毕业拟新规:强制20%不通过或需大改?
  12. PPT如何导出高清图片
  13. Ubuntu 14.04刷机时报错_BROM ERROR : S_UNDEFINED_ERROR (1001)
  14. SAP中重复制造生产计划编制——表格显示控制
  15. python 实现跳一跳自动化代码_跳一跳AI(wai gua)的实现原理详细介绍
  16. analytics -- Google 的使用。
  17. 学习IT的一点经验分享
  18. 即时通讯(IM)开源项目OpenIM重构版本发布- v2.0.0
  19. 学术垃圾的第三天(没有第二天
  20. C语言while循环模板,完整版)1《while循环》教学设计模板

热门文章

  1. 使用JQuery从客户端调用C#方法
  2. C#编程规范--控件命名篇[转]
  3. RHCE-postfix
  4. 从零开始开发JVM语言(十三)代码生成与ASM
  5. linux 数组的简单总结
  6. hadoop中汉字与英文字符混合的keyword做为combine的key的问题
  7. 求助:国际化中资源文件不在classpath中的问题
  8. iphone Quartz2D使用心得
  9. 如何修改world 2007文档结构图的字体 ???
  10. 如何在Linux使用Eclipse + CDT开发C/C++程序?