AF_UNIX与AF_LOCAL是一样的,只是历史遗留原因。
有SOCK_STREAM、SOCK_DGRAM、SOCK_SEQPACKET三种工作模式
1、SOCK_STREAM
流字节套,类似TCP,由于socket发送缓冲区的缘故,多次write数据会被缓冲区整合为一次底层send。禁用TCP Nagle算法的方式对AF_UNIX无效。
#include <netinet/in.h> // for IPPROTO_TCP #include <netinet/tcp.h> // for TCP_NODELAY int nodelay = 1; ret = setsockopt(mSocket, IPPROTO_TCP, TCP_NODELAY,(void*)&nodelay,sizeof(nodelay)); if (ret == -1) { printf("Couldn't setsockopt(TCP_NODELAY)\n"); }
2、SOCK_DGRAM
报文字节套,类似UDP的报文方式,理论上会导致错乱、丢失等风险,只是AF_UNIX性能很高,风险概率较小。SOCK_DGRAM的应用场合很少,因为流式套接字在本地的连接时间可以忽略,而SOCK_DGRAM发送接收都需要携带对方的本地地址,所以效率并没有提高。
3、SOCK_SEQPACKET
SOCK_SEQPACKET提供一个顺序确定的,可靠的,双向基于连接的socket endpoint. 与SOCK_STREAM不同的是,它保留消息边界。(表明发送两个数据包,只能分两次读入)使用SOCK_SEQPACKET工作模式,就可以保证每次write都会发起底层send。
mSocket = socket(AF_UNIX, SOCK_SEQPACKET, 0);
但这样接收端延迟非常严重。
4、设置发送端缓冲区容量
int ret = 0; int snd_buf_size = 0; socklen_t opt_size = sizeof(snd_buf_size); /* 获得sndbuf的长度 */ ret = getsockopt(mSocket, SOL_SOCKET, SO_SNDBUF, &snd_buf_size, &opt_size); printf("====================%d\n", snd_buf_size); /* 设置sndbuf的长度 */ int m = 100; // 无法低于系统默认,比如这里虽然设100,实际最小只能到2048 setsockopt(mSocket, SOL_SOCKET, SO_SNDBUF, (const char*)&m, sizeof(m)); if (ret == -1) { printf("====================Couldn't setsockopt(SO_SNDBUF)\n"); } ret = getsockopt(mSocket, SOL_SOCKET, SO_SNDBUF, &snd_buf_size, &opt_size); printf("====================%d\n", snd_buf_size);
所以仍然会有多次write一次send的现象。
5,屏蔽中断
如server已关闭,client继续write就会导致SIGPIPE中断,从而进程中断。
// 当write已关闭socket时会触发SIGPIPE,需要屏蔽 sigset_t signal_mask; sigemptyset(&signal_mask); /* 初始化信号集,并清除signal_mask中的所有信号 */ sigaddset(&signal_mask, SIGPIPE); /* 将signo添加到信号集中 */ sigprocmask(SIG_BLOCK, &signal_mask, NULL); /* 这个进程屏蔽掉signo信号 */
6,命名socket与非命名socket
命名socket必须具备“/tmp/xxx”的操作权限,因为会在该路径创建链路文件,直到unlink解除。
/* 服务器端 */ int server_len; sockaddr_un s_un; s_un.sun_family = AF_UNIX; strcpy(s_un.sun_path, "/tmp/xxx"); server_len = sizeof(struct sockaddr_un); bind(mSocket, (sockaddr*)&s_un, server_len); // 解除旧链路 unlink("/tmp/xxx"); /* 客户端 */ sockaddr_un mSockAddr.sun_family = AF_LOCAL; strcpy(mSockAddr.sun_path, "/tmp/xxx"); int mSockAddrLen = sizeof(sockaddr_un); connect(mSocket, (sockaddr*)&mSockAddr, mSockAddrLen);
而非命名socket没有这个限制,但要求必须以@开头声明链路且s_un.sun_path[0]=0。
#include <stddef.h> // for offsetof #define SERVER_NAME "@socket_server" /* 服务器端 */ int server_len; sockaddr_un s_un; s_un.sun_family = AF_UNIX; strcpy(s_un.sun_path, SERVER_NAME); s_un.sun_path[0]=0; int server_len = strlen(SERVER_NAME) + offsetof(struct sockaddr_un, sun_path); bind(mSocket, (sockaddr*)&s_un, server_len); /* 客户端 */ sockaddr_un mSockAddr.sun_family = AF_LOCAL; mSockAddr.sun_path[0]=0; int mSockAddrLen = strlen(SERVER_NAME) + offsetof(struct sockaddr_un, sun_path); connect(mSocket, (sockaddr*)&mSockAddr, mSockAddrLen);
相关推荐
服务端与多个客户端进行通信的源码 基于AF_UNIX域的socket编程 已将相关编程操作,写成API形式,方面使用者使用。
af_unixaf_unixaf_unixaf_unix 使用
junixsocket junixsocket是一个Java / JNI库,允许使用Java的(AF_UNIX套接字)。为什么很酷junixsocket是一个小型的模块化库。 仅安装您需要的内容。 与其他实现相反, junixsocket扩展了Java Sockets API( java...
NULL 博文链接:https://hyjiang1989.iteye.com/blog/1830462
IX 只能够用于单一的 Unix 系统进程间通信,而 AF_INET 是针对Internet的,因而可以允许在 远程 主机之间通信(当我们 man socket 时发现 domain 可选项是 PF_*而不是AF_*,因为 glibc 是 posix 的实现 所以用 PF代替...
刚才看到一个多线程查询的代码,觉得那个代码只实现了单线程操作,并且使用的是.net操作类,如果路径超过256就会出现查询错误(PathTooLongException),最近也做过类似的查询操作,使用的是win32api来实现的。...
通过AF_UNIX,SOCK_DGRAM类型的socket进行本机进程间通信的源代码。
2. bind: 将这个socket绑定在某个文件上(AF_UNIX)或某个端口上(AF_INET),我们会分别介绍这两种。 3. listen: 开始监听 4. accept: 如果监听到客户端连接,则调用accept接收这个连接并同时新建一个socket来和...
自己编写的socket 通信实例,用epoll实现,...#define SOCK_TYPE 1 /* 1-AF_UNIX 2-SOCK_STREAM */ 2. 编译工程,执行make 3. 运行sock_client 4. 另起一个终端运行sock_server 5. 在sock_client终端上输入数据回车。
协同通信中AF模式下的仿真,有图,有图,有图
协作通信下AF协作模式的MATLAB仿真代码
协作通信下AF协作模式的MATLAB仿真代码
该程序是我写的博客“一起talk C栗子吧(第一百五十八回:C语言实例--基于AF_INET域的流套接字通信 )”的配套程序,共享给大家使用
协作通信的AF方式,完整得仿真程序,可作为初学者的参考
该程序是我写的博客“一起talk C栗子吧(第一百五十九回:C语言实例--基于AF_INET域的数据报套接字通信 )”的配套程序,共享给大家使用
Garbage Collector For AF_UNIX sockets.
利用套接字创建socket文件完成本地两个进程之间的通信,这里分为进程A和进程B 进入主函数后,首先需要创建...创建完socket文件则需要准备地址,确保能与另一个进程连通,其中AF_LOCAL为通信类型,这里用的是本地通信。
jnr-unixsocket Java的本地I / O访问。 查看以获取更多信息。
AF_UNIX, AF_LOCAL Local communication unix(7) AF_INET IPv4 Internet protocols ip(7) AF_INET6 IPv6 Internet protocols ipv6(7) AF_IPX IPX - Novell protocols AF_NETLINK Kernel user interface device ...
关于MIMO系统协作通信的程序,可以仿真出现象,欢迎大家下载。