本地套接字示例[来源:Advanced Linux Programming]

  要通过套接字连接同一台主机上的进程,可以使用符号常量 PF_LOCAL 和 PF_UNIX所代表的本地命名空间。它们被称为本地套接字(local sockets)或者 UNIX 域套接字(UNIX-domain sockets)。它们的套接字地址用文件名表示,且只在建立连接的时候使用。
  套接字的名字在 struct sockaddr_un 结构中指定。你必须将 sun_family 字段设置为 AF_LOCAL 以表明它使用本地命名空间。该结构中的 sun_path 字段指定了套接字使用的路径,该路径长度必须不超过 108 字节。而 struct sockaddr_un 的实际长度应由UN_LENG 宏计算得到。可以使用任何文件名作为套接字路径,但是进程必须对所指定的
目录具有写权限,以便向目录中添加文件。如果一个进程要连接到一个本地套接字,则必须具有该套接字的读权限。尽管多台主机可能共享一个文件系统,只有同一台主机上运行的程序之间可以通过本地套接字通信。

socket-server.c

/*
zzb 2011-11-17 22:30
<<高级Linux编程.pdf>> page101: socket-server.c
功能:本地命名空间套接字服务器
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
int server(int client_socket)
{
int length;
char *text;
if(read(client_socket, &length, sizeof(length)) == 0) // 获取消息长度,保存到length
return 0;
text = malloc(length);                 // 分配用于保存信息的缓冲区
read(client_socket, text, length);
printf("%s\n", text);
if(!strcasecmp(text, "quit"))         // 忽略大小写比较字符串
{
free(text);                         // 释放缓冲区
return 1;
}
free(text);
return 0;
}
int main(int argc, char *argv[])
{
const char* const socket_name = argv[1];
int sock_fd;
struct sockaddr_un name;
int client_sent_quit_message;
if((sock_fd = socket(PF_LOCAL, SOCK_STREAM, 0)) == -1)
{
perror("socket");
return 1;
}
name.sun_family = AF_LOCAL;
strcpy(name.sun_path, socket_name);
if(bind(sock_fd, (const struct sockaddr*)&name, SUN_LEN(&name)) == -1)
{
perror("bind");
return 1;
}
if(listen(sock_fd, 5) == -1)
{
perror("listen");
return 1;
}
do
{
struct sockaddr_un client_name;
socklen_t client_name_len;
int client_socket_fd;
client_socket_fd = accept(sock_fd, (struct sockaddr*)&client_name, &client_name_len);
client_sent_quit_message = server(client_socket_fd);
close(client_socket_fd);
}while(!client_sent_quit_message);
close(sock_fd);                     // 关闭套接字文件
unlink(socket_name);                // 删除套接字文件
return 0;
}

socket-client.c

/*
zzb 2011-11-17 22:37
<<高级Linux编程.pdf>> page103: socket-client.c
功能:本地命名空间套接字服务器
*/
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
void write_text(int socket_fd, const char* text)
{
int length = strlen(text) + 1;
write(socket_fd, &length, sizeof(length));      // 写入长度信息
write(socket_fd, text, length);                 // 写入消息
}
int main(int argc, char *argv[])
{
const char* const socket_name = argv[1];       // 套接字文件路径
const char* const message = argv[2];           // 要发送的消息
int socket_fd;
struct sockaddr_un name;
socket_fd = socket(PF_LOCAL, SOCK_STREAM, 0);  // 创建本地套接字
name.sun_family = AF_LOCAL;
strcpy(name.sun_path, socket_name);
connect(socket_fd, (const struct sockaddr*)&name, SUN_LEN(&name));      // 连接套接字
write_text(socket_fd, message);                 // 向套接字写入数据
close(socket_fd);
return 0;
}

编译运行:

[zcm@socket #78]$make
gcc -g   -c -o socket-server.o socket-server.c
gcc -g -o socket-server socket-server.o
gcc -g   -c -o socket-client.o socket-client.c
gcc -g -o socket-client socket-client.o
[zcm@socket #79]$./socket-server /tmp/socket
what can you do for me
what are\nyou doing
this program is great
Quit
[zcm@socket #80]$

运行客户端:

[zcm@socket #19]$./socket-client /tmp/socket "what can you do for me"
[zcm@socket #20]$./socket-client /tmp/socket "what are\nyou doing"
[zcm@socket #21]$./socket-client /tmp/socket "this program is great"
[zcm@socket #22]$./socket-client /tmp/socket "Quit"
[zcm@socket #23]$

本地套接字示例[来源:Advanced Linux Programming]相关推荐

  1. Linux网络编程——Unix本地套接字

    概述 今天给大家讲解网络编程中的一个内容--Unix 本地套接字. 发现很多人不知道或者不太了解 Unix 本地套接字这个概念,这也难怪,socket API 原本就是为多台主机之间网络通信设计的,并 ...

  2. linux 本地套接字 路径,linux本地套接字

    本地套接字实现的是同一主机的不同进程间的通信,且建立的通信是双向的通信.socket本地通信与网络通信使用的是统一套接口,只是地址结构中的参数不同. 1.socket流程 (1)创建socket 创建 ...

  3. linux编程本地套接字

    linux编程本地套接字 本地套接字是 IPC,也就是本地进程间通信的一种实现方式.除了本地套接字以外,其它技术,诸如管道.共享消息队列等也是进程间通信的常用方法,但因为本地套接字开发便捷,接受度高, ...

  4. linux的基础知识——本地套接字

    1.本地套接字

  5. Linux套接字编程之sockaddr与sockaddr_in网络套接字,sockaddr_un进程间通信本地套接字

    sockaddr struct sockaddr { unsigned  short  sa_family;     /* address family, AF_xxx */ char  sa_dat ...

  6. Linux本地套接字通信

    1. 本地套接字 socket API原本为网络通信而设计,后来在其基础上扩展出本地套接字机制用于本地进程间通信. 本地套接字为全双工通信方式. 2. 本地套接字的使用 2.1 本地套接字通信步骤 ( ...

  7. Linux——进程间通信的常见方法(管道、信号、共享映射区、本地套接字)、管道的了解与简单用法

    进程间通信IPC的原理: 常见的进程间通信方式有: 管道(使用最简单) 信号(开销最小) 共享映射区(无血缘关系) 本地套接字(最稳定) 二.管道的特质与基本用法 内核借助环形队列机制,使用内核缓冲区 ...

  8. tomcat套接字接受失败_07 | What? 还有本地套接字?

    很多人都知道 TCP 和 UDP,但是对本地套接字却不甚了解. 实际上,本地套接字是 IPC,也就是本地进程间通信的一种实现方式.除了本地套接字以外,其它技术,诸如管道.共享消息队列等也是进程间通信的 ...

  9. 本地套接字(domain)

    本地套接字是一种特殊类型的套接字,和 TCP/UDP 套接字不同.TCP/UDP 即使在本地地址通信,也要走系统网络协议栈,而本地套接字,严格意义上说提供了一种单主机跨进程间调用的手段,减少了协议栈实 ...

最新文章

  1. QML与Qt C++ 交互机制探讨与总结
  2. 澳洲留学征文活动获奖情况公布
  3. 符号链接和硬链接有什么区别?
  4. ubuntu安装python 3.7.x
  5. limit是mysql的语法
  6. 北京2008奥运会吉祥物福娃大家庭
  7. 数据驱动工程:跟踪使用,合理决策
  8. Codeforces 1140F 线段树 分治 并查集
  9. Qt中鼠标事件捕获与Qt对象事件过滤
  10. MATLAB 信号处理仿真入门实验
  11. 企业网络工程设计——局域网中的冗余链路
  12. 进阶篇: ramdump分析--9 ram dump文件种类
  13. NRF24L01+在K60单片机中的具体实现
  14. 基于微信小程序的每日签到打卡系统ssm框架
  15. 暴力破解Windows密码(二、三):使用getpass内存提取windows用户密码、使用quarkpwdump导出windows用户密码hash值
  16. 超级AI买家阿里巴巴
  17. 最新php开发学习资料网盘下载
  18. 《李焕英》爆火背后,世界正在奖励那些诚实的人
  19. 折半查找--hnust oj
  20. 寻找两个有序数组的中位数(虚拟数组图文详解)

热门文章

  1. 同一页面引入多个JS文件的编码问题
  2. Power BI:M与DAX以及度量与计算列
  3. 删除wallet里面登机牌_登机牌丢失问题
  4. 在Java里如何给一个日期增加一天
  5. leetcode337. 打家劫舍 III(dfs)
  6. leetcode167. 两数之和 II - 输入有序数组(二分查找)
  7. 通过在Chipotle用餐了解模板方法设计模式
  8. 别把“运气”当“实力”
  9. C# PagedList 真分页
  10. pandas之Series