主要注意流程:

STREAM SOCKET:

Server :  socket() --->  bind() ---> listen()  ---> accept()

Client:    scoket() ---> connect()

参考文章一篇就够:http://troydhanson.github.io/misc/Unix_domain_sockets.html

自己写的 一个 Server 和 一个Client:

//Server
//
// unix_domain_server.c
// UnixDomainServer
//
// Created by gtliu on 7/11/13.
// Copyright (c) 2013 GT. All rights reserved.
// #include "MITLogModule.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <stddef.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h> #define FUNC_FAIL -1
#define FUNC_SUCCESS 0
#define SOCKADDR_UN_SUN_PATH_MAX_LEN 103 // 104 - 1
#define SER_ACCEPT_CON_NUM 1 /**
* Create a server endpoint of a connection.
*
* @param scok_path: the unix domain socket path
* @return return the file descirption if all ok, <0 on err
*/
int create_serv_listen(const char *sock_path)
{
size_t path_len = strlen(sock_path);
if (path_len == 0) {
MITLogWrite(MITLOG_LEVEL_ERROR, "socket path can't be empty");
return FUNC_FAIL;
} else if (path_len > SOCKADDR_UN_SUN_PATH_MAX_LEN) {
MITLogWrite(MITLOG_LEVEL_ERROR, "socket path length must less than%d", SOCKADDR_UN_SUN_PATH_MAX_LEN);
return FUNC_FAIL;
} int fd = 0, size = 0;
struct sockaddr_un server_un;
memset(&server_un, 0, sizeof(server_un));
server_un.sun_family = AF_UNIX;
strncpy(server_un.sun_path, sock_path, sizeof(server_un.sun_path) - 1); if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
MITLogWrite(MITLOG_LEVEL_ERROR, "socket() faild:%s", strerror(errno));
return FUNC_FAIL;
}
/* in case it already exists */
unlink(sock_path); size = offsetof(struct sockaddr_un, sun_path) + strlen(server_un.sun_path);
if (bind(fd, (struct sockaddr *)&server_un, size) < 0) {
MITLogWrite(MITLOG_LEVEL_ERROR, "bind() failed:%s", strerror(errno));
close(fd);
return FUNC_FAIL;
} if (listen(fd, 0) < 0) {
MITLogWrite(MITLOG_LEVEL_ERROR, "listen() failed:%s", strerror(errno));
close(fd);
return FUNC_FAIL;
} return fd;
} /**
* Accept a client's connection and return the relative file descriptor.
*
* @param listen_fd: the server socket file descriptor
* @return return the file descirption if all ok, <0 on err
*/
int serv_accept(int listen_fd)
{
int child_fd = 0, len = 0;
struct sockaddr_un income_un;
len = sizeof(income_un); if ((child_fd = accept(listen_fd, (struct sockaddr *)&income_un, &len)) < 0) {
MITLogWrite(MITLOG_LEVEL_ERROR, "accept() failed:%s", strerror(errno));
/* often errno=EINTR, if signal caught */
return FUNC_FAIL;
}
return child_fd;
} int main(int argc, const char * argv[])
{ MITLogOpen("unix_domain_server"); char *sock_path = "/tmp/domain_socket_one";
if (argc > 1) {
sock_path = (char *) argv[1];
} MITLogWrite(MITLOG_LEVEL_COMMON, "Starting the server...");
int listen_fd = create_serv_listen(sock_path);
if (listen_fd == FUNC_FAIL) {
return FUNC_FAIL;
} MITLogWrite(MITLOG_LEVEL_COMMON, "Wait for the client... listen_fd:%d", listen_fd);
int child_fd = serv_accept(listen_fd);
if (child_fd == FUNC_FAIL) {
close(listen_fd);
return FUNC_FAIL;
} char recv_buffer[1024] = {0};
while (1) {
MITLogWrite(MITLOG_LEVEL_COMMON, "Wait for the message...");
if(read(child_fd, recv_buffer, sizeof(recv_buffer) - 1) > 0) {
printf("Recieve message:%s\n", recv_buffer);
}
sleep(2);
} MITLogClose();
return 0;
}
//Client
//
// main.c
// UnixDomainClient
//
// Created by gtliu on 7/11/13.
// Copyright (c) 2013 GT. All rights reserved.
// #include "MITLogModule.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <stddef.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/stat.h> #define FUNC_FAIL -1
#define FUNC_SUCCESS 0
#define SOCKADDR_UN_SUN_PATH_MAX_LEN 103 // 104 - 1
#define SER_ACCEPT_CON_NUM 1 /**
* Create a server endpoint of a connection.
*
* @param scok_path: the unix domain socket path
* @return return the file descirption if all ok, <0 on err
*/
int client_connection(const char *sock_path)
{
size_t path_len = strlen(sock_path);
if (path_len == 0) {
MITLogWrite(MITLOG_LEVEL_ERROR, "socket path can't be empty");
return FUNC_FAIL;
} else if (path_len > SOCKADDR_UN_SUN_PATH_MAX_LEN) {
MITLogWrite(MITLOG_LEVEL_ERROR, "socket path length must less than%d", SOCKADDR_UN_SUN_PATH_MAX_LEN);
return FUNC_FAIL;
} int fd = 0, len = 0;
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
MITLogWrite(MITLOG_LEVEL_ERROR, "socket() faild:%s", strerror(errno));
return FUNC_FAIL;
} struct sockaddr_un client_un;
memset(&client_un, 0, sizeof(client_un));
client_un.sun_family = AF_UNIX;
strncpy(client_un.sun_path, sock_path, sizeof(client_un.sun_path) - 1); len = offsetof(struct sockaddr_un, sun_path) + strlen(client_un.sun_path);
if ((connect(fd, (struct sockaddr *)&client_un, len)) < 0) {
MITLogWrite(MITLOG_LEVEL_ERROR, "connect() failed:%s", strerror(errno));
close(fd);
return FUNC_FAIL;
} return fd;
} int main(int argc, const char * argv[])
{ MITLogOpen("unix_domain_client"); char *sock_path = "/tmp/domain_socket_one";
if (argc > 1) {
sock_path = (char *) argv[1];
} MITLogWrite(MITLOG_LEVEL_COMMON, "Starting the client...");
int client_fd = client_connection(sock_path);
if (client_fd == FUNC_FAIL) {
return FUNC_FAIL;
} for (int i=1; i < 100; ++i) {
MITLogWrite(MITLOG_LEVEL_COMMON, "Send message to server...");
char msg[256] = {0};
sprintf(msg, "client message :%d", i);
if(write(client_fd, msg, strlen(msg)) > 0) {
MITLogWrite(MITLOG_LEVEL_COMMON, "Send message :%d success", i);
}
sleep(2);
} MITLogClose();
return 0;
}

Unix Domain Socket 域套接字实现的更多相关文章

  1. 【转】PHP实现系统编程(四)--- 本地套接字(Unix Domain Socket)

    原文:http://blog.csdn.net/zhang197093/article/details/78143687?locationNum=6&fps=1 --------------- ...

  2. Unix domain socket

    转载:http://www.cnblogs.com/chekliang/p/3222950.html socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是 ...

  3. (unix domain socket)使用udp发送>=128K的消息会报ENOBUFS的错误

    一个困扰我两天的问题, Google和Baidu没有找到解决方法! 此文为记录这个问题,并给出原因和解决方法. 1.Unix domain socket简介 unix域协议并不是一个实际的协议族,而是 ...

  4. [apue] 作为 daemon, 启动 Unix Domain Socket 侦听失败?

    前段时间写一个传递文件句柄的小 demo,有 server 端.有 client 端,之间通过 Unix Domain Socket 通讯. 在普通模式下,双方可以正常建立连接,当server端作为d ...

  5. Envoy 基础教程:使用 Unix Domain Socket(UDS) 与上游集群通信

    Envoy Proxy 在大多数情况下都是作为 Sidecar 与应用部署在同一网络环境中,每个应用只需要与 Envoy(localhost)交互,不需要知道其他服务的地址.然而这并不是 Envoy ...

  6. Unix domain socket 简介

    Unix domain socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信.socket 原本是为网络通讯设 ...

  7. mysql unix domain socket and network socket, ssh key

    当主机填写为localhost时mysql会采用 unix domain socket连接 当主机填写为127.0.0.1时mysql会采用tcp方式连接 这是linux套接字网络的特性,win平台不 ...

  8. linux一切皆文件之Unix domain socket描述符(二)

    一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 3.主要用于 ...

  9. Unix domain socket IPC

    UNIX Domain socket 虽然网络socket也可用于同一台主机的进程间通讯(通过lo地址127.0.0.1),但是unix domain socket用于IPC更有效率:不需要经过网络协 ...

随机推荐

  1. 重操JS旧业第三弹:Array

    数组在任何编程语言中都是非常重要的,因为函数在最大程度上代表了要实现的功能,而数组则是这些函数所要操作的内存一部分. 1 构建数组 js与其他非脚本语言的灵活之处在于要实现一个目标它可能具有多种方式, ...

  2. vc怎么去掉烦人的“驱动器未准备好”错误

    在我们写程序的时候,如果访问一个软驱中没有软盘或者光驱中没有cd的时候,windows总是弹出一个恼人的错误框说“驱动器未准备好” 其实我们可以通过如下的步骤禁止这个错误框的弹出 一.用SetErro ...

  3. mongdb修改密码

    正确做法,利用db.changeUserPassword > db.changeUserPassword('tank2','test');

  4. 基于visual Studio2013解决C语言竞赛题之1055排序

       题目 解决代码及点评 /* 功能:已知A是有30个元素的整型数组,编写一个对A[I1]到A[I2](I1≤I2)之间的元素排序的函数(从大到小排序) 请调用上述函数先将A[5]至A[ ...

  5. Swift - iCloud存储介绍

    对于开发者而言,涉及iCloud存储的功能主要有两个: 一是 iCloud documnet storage,利用 iCloud 存储用户文件,比如保存一些用户在使用应用时生成的文件以及数据库文件等. ...

  6. Android switch 中 case expressions must be constant expressions 错误

    刚才导入android zxing 条码 的demo测试,发现出现如下错误 case expressions must be constant expressions 经检查,项目被设置成librar ...

  7. HDU 4868 Information Extraction(2014 多校联合第一场 H)

    看到这道题时我的内心是奔溃的,没有了解过HTML,只能靠窝的渣渣英语一点一点翻译啊TT. Information Extraction 题意:(纯手工翻译,有些用词可能在html中不是一样的,还多包涵 ...

  8. Qt4创建工程的几种方法:linux系统

    方法一:以Qt Creator 作为IDE 1.启动Qt Creator,并创建一个空项目 2.输入路径和工程名字 3.添加cpp文件 4.添加代码,并且编译执行 5.执行结果 方法二:利用linux ...

  9. Mahout-Pearson correlation的实现

    计算公式: 并通过以下代码对Mahout in Action的结果进行了验证: 代码例如以下: ` package com.example.mahout; public class TestColl ...

  10. VC++实现位图显示透明效果--实现原理

    我们在进行程序的界面设计时,常常希望将位图的关键部分,也既是图像的前景显示在界面上,而将位图的背景隐藏起来,将位图与界面很自然的融合在一起,本文介绍了透明位图的制作知识,并将透明位图在一个对话框中显示 ...