本地套接字示例[来源:Advanced Linux Programming]
本地套接字示例[来源: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]相关推荐
- Linux网络编程——Unix本地套接字
概述 今天给大家讲解网络编程中的一个内容--Unix 本地套接字. 发现很多人不知道或者不太了解 Unix 本地套接字这个概念,这也难怪,socket API 原本就是为多台主机之间网络通信设计的,并 ...
- linux 本地套接字 路径,linux本地套接字
本地套接字实现的是同一主机的不同进程间的通信,且建立的通信是双向的通信.socket本地通信与网络通信使用的是统一套接口,只是地址结构中的参数不同. 1.socket流程 (1)创建socket 创建 ...
- linux编程本地套接字
linux编程本地套接字 本地套接字是 IPC,也就是本地进程间通信的一种实现方式.除了本地套接字以外,其它技术,诸如管道.共享消息队列等也是进程间通信的常用方法,但因为本地套接字开发便捷,接受度高, ...
- linux的基础知识——本地套接字
1.本地套接字
- Linux套接字编程之sockaddr与sockaddr_in网络套接字,sockaddr_un进程间通信本地套接字
sockaddr struct sockaddr { unsigned short sa_family; /* address family, AF_xxx */ char sa_dat ...
- Linux本地套接字通信
1. 本地套接字 socket API原本为网络通信而设计,后来在其基础上扩展出本地套接字机制用于本地进程间通信. 本地套接字为全双工通信方式. 2. 本地套接字的使用 2.1 本地套接字通信步骤 ( ...
- Linux——进程间通信的常见方法(管道、信号、共享映射区、本地套接字)、管道的了解与简单用法
进程间通信IPC的原理: 常见的进程间通信方式有: 管道(使用最简单) 信号(开销最小) 共享映射区(无血缘关系) 本地套接字(最稳定) 二.管道的特质与基本用法 内核借助环形队列机制,使用内核缓冲区 ...
- tomcat套接字接受失败_07 | What? 还有本地套接字?
很多人都知道 TCP 和 UDP,但是对本地套接字却不甚了解. 实际上,本地套接字是 IPC,也就是本地进程间通信的一种实现方式.除了本地套接字以外,其它技术,诸如管道.共享消息队列等也是进程间通信的 ...
- 本地套接字(domain)
本地套接字是一种特殊类型的套接字,和 TCP/UDP 套接字不同.TCP/UDP 即使在本地地址通信,也要走系统网络协议栈,而本地套接字,严格意义上说提供了一种单主机跨进程间调用的手段,减少了协议栈实 ...
最新文章
- QML与Qt C++ 交互机制探讨与总结
- 澳洲留学征文活动获奖情况公布
- 符号链接和硬链接有什么区别?
- ubuntu安装python 3.7.x
- limit是mysql的语法
- 北京2008奥运会吉祥物福娃大家庭
- 数据驱动工程:跟踪使用,合理决策
- Codeforces 1140F 线段树 分治 并查集
- Qt中鼠标事件捕获与Qt对象事件过滤
- MATLAB 信号处理仿真入门实验
- 企业网络工程设计——局域网中的冗余链路
- 进阶篇: ramdump分析--9 ram dump文件种类
- NRF24L01+在K60单片机中的具体实现
- 基于微信小程序的每日签到打卡系统ssm框架
- 暴力破解Windows密码(二、三):使用getpass内存提取windows用户密码、使用quarkpwdump导出windows用户密码hash值
- 超级AI买家阿里巴巴
- 最新php开发学习资料网盘下载
- 《李焕英》爆火背后,世界正在奖励那些诚实的人
- 折半查找--hnust oj
- 寻找两个有序数组的中位数(虚拟数组图文详解)