本地套接字示例[来源: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]$



 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在JAVA中如何跳出当前的多重嵌套循环

在Java中&#xff0c;要想跳出多重循环&#xff0c;可以在外面的循环语句前定义一个标号&#xff0c;然后在里层循环体的代码中使用带有标号的break 语句&#xff0c;即可跳出外层循环。例如&#xff0c; ok: for(int i0;i<10;i) { for(int j0;j<10;j) { System.out.prin…

CSS之background-position属性

1.作用&#xff1a;background-position是用来控制元素背景图片的位置。以图片的左上角顶点为原点&#xff0c;属性值为正就代表图片下移或右移&#xff0c;属性值为负就代表图片上移或左移。它接受三种值 - 关键词&#xff0c;比如top、right、bottom、left和center - 长度值…

vue-cli3.0之vue.config.js的配置项(注解)

module.exports {// 部署应用时的基本 URL(从 Vue CLI 3.3 起已弃用&#xff0c;请使用publicPath。)baseUrl: process.env.NODE_ENV production ? 192.168.60.110:8080 : 192.168.60.110:8080,// 部署应用包时的基本 URL。用法和 webpack 本身的 output.publicPath 一致pub…

用户登录成功后才进入主窗口进行其他操作

应用前景&#xff1a;面对一个应用程序&#xff0c;用户只有输入正确的用户名和密码后&#xff0c;才能进入主窗口进行其他的操作&#xff1b;否则&#xff0c;提示登录失败&#xff0c;重新输入。 开发环境&#xff1a;Windows XP VC6.0 新建一个基于MFC的单文档应用程序(项…

javascript学习系列(20):数组中的bind,apply,call

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说…

DSOfile,修改windows系统文件摘要

今天要做一个功能&#xff0c;就是修改图片的摘要信息&#xff0c;一开始采用的是修改exif信息的方式&#xff0c;但是很多的图片没有exif信息&#xff0c;或者没有指定的exif项&#xff0c;又找别的方法&#xff0c;来修改文件的摘要信息。 首先是采用ole32.dll,但是郁闷的是&…

CSS之background-origin属性

1.作用&#xff1a;其实background-origin主要就是用来决定背景图片的定位原点&#xff0c;换句话说就是背景图片定位的起点&#xff08;background-position的原点&#xff09; 如果你看过了《CSS3 background-clip》一文&#xff0c;你不难发现&#xff0c;元素Background中…

Vue.js CLI4 Vue.config.js标准配置 (最全注释)

前言&#xff1a; Vue.js CLI工具 不知不觉发展到了4.0时代&#xff0c;CLI给人最直白的感受是没有了build文件夹跟config文件夹&#xff0c;所有的配置都在Vue.config.js完成。那么该文件的配置至关重要。现在我们来看一下最新配置是怎么配置的。 有三种方式&#xff0c;推荐…

javascript学习系列(22):数组中的reduceRight法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说…

java模拟开锁

java模拟开锁 service qq:928900200 Introduction to Computer Science II: CSCI142Fall 2014Lab #1Instructor: Daniel PlanteAssigned: Monday, September 8, 2014Turn In By: Monday, September 15, 2014 (Zipped project with allfiles by MIDNIGHT)For this lab, you will…

vue中mode的设置

在学过渡效果的时候&#xff0c;里边有一个mode的设置&#xff0c;但是在路由的属性中还有一个mode。 mode的两个值 histroy:当你使用 history 模式时&#xff0c;URL 就像正常的 url&#xff0c;例如 http://localhost:8080/hi&#xff0c;也好看&#xff01;hash:默认’has…

CSS之Background-clip属性

1.作用&#xff1a;CSS3中的Background-clip属性&#xff0c;其主要是用来确定背景的裁剪区域&#xff0c;换句话说&#xff0c;就是如何控制元素背景显示区域 2.语法&#xff1a;background-clip &#xff1a; border-box || padding-box || content-box 3.取值说明&#xf…

OLE、OCX和ActiveX控件之间的比较

一、过去的OLE和今天的OLE 最初的OLE含义是指在程序之间链接和嵌入对象数据&#xff0c;它提供了建立混合文档的手段&#xff08;资深Windows 3.X 用户可能记得当初在Word6.0中插入一个图形的新奇和喜悦&#xff09;&#xff0c;使得那些没有太多专业知识的用户能够很容易地协调…

Vista系统自带IIS 7.0设置技巧详解

初用IIS7让人一头雾水&#xff0c;再也没有原来熟悉的属性窗体&#xff0c;替代的是一些很陌生的名词和操作方式。现在不评它这种改变是好是坏&#xff0c;先让它给我们跑起来吧。 首先是安装IIS7&#xff0c;Vista默认的情况下是没有安装IIS7&#xff0c;所以我们要在"控…

Spring Bean初始化过程

一、首先我们来看ClassPathXmlApplicationContext类体系结构 从该继承体系可以看出&#xff1a; 1. BeanFactory 是一个 bean 工厂的最基本定义&#xff0c;里面包含了一个 bean 工厂的几个最基本的方 法&#xff0c;getBean(…) 、 containsBean(…) 等 ,是一个很纯粹的…

关于height:100%和height:100vh的区别

1.em 在做手机端的时候经常会用到的做字体的尺寸单位 说白了 em就相当于“倍”&#xff0c;比如设置当前的div的字体大小为1.5em&#xff0c;则当前的div的字体大小为&#xff1a;当前div继承的字体大小*1.5 但是当div进行嵌套的时候&#xff0c;em始终是按照当前div继承的字…

顶宽的div中的英文不能自动换行

1.在一个设定好宽度的div中&#xff0c;当我们输入的中文文字长度超过了设定宽度时&#xff0c;会自动换到下一行。但是&#xff0c;如果输入的是英文字母&#xff0c;那么&#xff0c;无论你div设定宽度为多少&#xff0c;英文字母都是不换行直接在同一行输出&#xff0c;导致…

读取CPU信息

简单的讲下读取CPU信息的一个思路&#xff0c;看了后&#xff0c;相信谁都会说&#xff1a;原来这么简单呀&#xff0c;我也会。哈哈&#xff0c;进入正题&#xff0c;看图&#xff1a; 看清楚了吗&#xff0c;原来CPU信息在注册表里就有。如果你只是要简单的CPU信息&#xff0…

samba3.2的安装全过程(tar方式)

samba服务器,我相信大家都不陌生,主要用来实现windows和linux之间的资源共享,网上比较多的是采用rpm安装包的方式安装,我个人也觉得rpm方式安装比较方便容易,如果没什么特别需求,还是用这种吧!我这里介绍的是采用tar方式的安装.首先下载一个samba的安装文件:samba-3.2.0.tar.gz…