Unix Domain Socket 域套接字实现
主要注意流程:
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 域套接字实现的更多相关文章
- 【转】PHP实现系统编程(四)--- 本地套接字(Unix Domain Socket)
原文:http://blog.csdn.net/zhang197093/article/details/78143687?locationNum=6&fps=1 --------------- ...
- Unix domain socket
转载:http://www.cnblogs.com/chekliang/p/3222950.html socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是 ...
- (unix domain socket)使用udp发送>=128K的消息会报ENOBUFS的错误
一个困扰我两天的问题, Google和Baidu没有找到解决方法! 此文为记录这个问题,并给出原因和解决方法. 1.Unix domain socket简介 unix域协议并不是一个实际的协议族,而是 ...
- [apue] 作为 daemon, 启动 Unix Domain Socket 侦听失败?
前段时间写一个传递文件句柄的小 demo,有 server 端.有 client 端,之间通过 Unix Domain Socket 通讯. 在普通模式下,双方可以正常建立连接,当server端作为d ...
- Envoy 基础教程:使用 Unix Domain Socket(UDS) 与上游集群通信
Envoy Proxy 在大多数情况下都是作为 Sidecar 与应用部署在同一网络环境中,每个应用只需要与 Envoy(localhost)交互,不需要知道其他服务的地址.然而这并不是 Envoy ...
- Unix domain socket 简介
Unix domain socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信.socket 原本是为网络通讯设 ...
- mysql unix domain socket and network socket, ssh key
当主机填写为localhost时mysql会采用 unix domain socket连接 当主机填写为127.0.0.1时mysql会采用tcp方式连接 这是linux套接字网络的特性,win平台不 ...
- linux一切皆文件之Unix domain socket描述符(二)
一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 3.主要用于 ...
- Unix domain socket IPC
UNIX Domain socket 虽然网络socket也可用于同一台主机的进程间通讯(通过lo地址127.0.0.1),但是unix domain socket用于IPC更有效率:不需要经过网络协 ...
随机推荐
- perl 获取文件内容里第一个AAA和最后一个AAA
<pre name="code" class="html">[root@wx03 ~]# cat -n aaa 1 3`13 2 edqae 3 d ...
- 基于visual Studio2013解决面试题之0501上台阶
题目
- webview加载网页加载不出来
1.webView.loadUrl(picTargetUrl); 写在最前面. 1.在无线城市迷你版的项目,用webview去loadUrl的时候出现加载的现象. url 地址是 http://go. ...
- ubuntu 10.04安装qtcreator并汉化
最近最的项目中需要做出来一个带有界面的demo,所以想到了用qt做个简单的demo! 于是在ubuntu上安装了qt,很简单apt-get apt-get install qtcreator 大概几百 ...
- hive udaf 用maven打包运行create temporary function 时报错
用maven打包写好的jar,在放到hive中作暂时函数时报错. 错误信息例如以下: hive> create temporary function maxvalue as "com. ...
- ubuntu12.04 安装 opencv 2.4.8(非源代码编译)
一:安装所须要的各种库,如GTK3.xx 安装GCC:sudo apt-get install build-essential 安装CMakesudo apt-get install cmake su ...
- 使用gradle打包jar包
近期用android studio来做android开发的IDE,它是使用gradle来构建的,于是開始学习gradle. 如今有一个项目,里面有一个android-library的模块.我想在做re ...
- 【Ubuntu】升到14,攻克了进入用户后没有菜单条导航栏的问题
控制台还能够进,用ctrl+alt+f1用老账号登录,用sudo adduser test新建立一个名字叫test的帐号 然后就能够进去了,可能是配置文件坏掉了
- android花屏效果的实现(ViewPager的基本使用)
1.程序运行效果图 二.代码实现 1.main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/re ...
- 利用ArrayList对Hashtable其进行排序
前言: 最近在使用Hashtable的时候发现一个问题:就是当你对Hashtable进行遍历的时候整个输出结果是毫无顺序的, 上网查了一下说是Hashtable有自己内部的排序机制,如果要自定义排序的 ...