第15章 Unix域协议
时间:2022-05-03
本文章向大家介绍第15章 Unix域协议,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
#include <sys/un.h>
struct sockaddr_un
{
sa_family_t sun_family; /* AF_LOCAL */
char sun_path[104]; /*可能是92~108*/
};
#include <sys/socket.h>
//创建两个连接起来的Unix域套接字
int socketpair(int family/*AF_LOCAL*/, int type, int protocol/*0*/, int sockfd[2]);//SOCK_STREAM创建全双工的流管道
Unix域字节流客户端
#include "../Gnet.h"
void do_client(int connfd)
{
char buf[MAX_LINE];
while(fgets(buf, MAX_LINE, stdin) != NULL)
{
Write(connfd, buf, strlen(buf));
memset(buf, 0, MAX_LINE);
if(Read(connfd, buf, MAX_LINE) == 0)
perr_exit("server terminated.n");
fputs(buf, stdout);
}
}
int main(int argc, const char* argv[])
{
int connfd;
struct sockaddr_un server_addr;
connfd = Socket(AF_LOCAL, SOCK_STREAM, 0);
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sun_family = AF_LOCAL;
strcpy(server_addr.sun_path, LOCAL_STRPATH);
Connect(connfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
do_client(connfd);
return 0;
}
Unix字节流服务器
#include "../Gnet.h"
void do_server(int connfd)
{
ssize_t nread;
char buf[MAX_LINE];
while((nread = Read(connfd, buf, MAX_LINE)) > 0)
Write(connfd, buf, nread);
}
void sig_child(int signo)
{
pid_t pid;
int stat;
printf("in sig_child.n");
while((pid = waitpid(-1,&stat, WNOHANG)) > 0)
printf("child %d terminatedn", pid);
printf("out sig_child.n");
}
int main(int argc, const char* argv[])
{
int lfd, connfd;
struct sockaddr_un server_addr, client_addr;
socklen_t client_addr_len;
pid_t child_id;
struct sigaction sigaction_set, sigaction_get;
sigaction_set.sa_handler = sig_child;
sigemptyset(&sigaction_set.sa_mask);
sigaction_set.sa_flags = 0;
if(sigaction(SIGCHLD, &sigaction_set, &sigaction_get) <0)
printf("sigaction(SIGCHLD) error!n");
memset(&server_addr, 0, sizeof(server_addr));
unlink(LOCAL_STRPATH);//bind之前删除路径名
server_addr.sun_family = AF_LOCAL;
strcpy(server_addr.sun_path, LOCAL_STRPATH);
lfd = Socket(AF_LOCAL, SOCK_STREAM, 0);
Bind(lfd, (const struct sockaddr*)&server_addr, sizeof(server_addr));
Listen(lfd, LISTENQ);
while(1)
{
client_addr_len = sizeof(client_addr_len);
connfd = Accept(lfd, (struct sockaddr*)&client_addr, &client_addr_len);
if((child_id = fork()) == 0)//子进程
{
Close(lfd);
do_server(connfd);
Close(connfd);
exit(0);
}
else//父进程
{
printf("child %d connectedn", child_id);
Close(connfd);
}
}
return 0;
}
Unix域数据报客户端
#include "../Gnet.h"
void do_client(int udpfd, struct sockaddr* pserver_addr, socklen_t server_addr_len)
{
char buf[MAX_LINE];
int nread;
while(fgets(buf, MAX_LINE, stdin) != NULL)
{
sendto(udpfd, buf, strlen(buf), 0, pserver_addr, server_addr_len);
nread = recvfrom(udpfd, buf, MAX_LINE, 0, NULL, NULL);
fputs(buf, stdout);
}
}
int main(int argc, const char* argv[])
{
int sockfd;
struct sockaddr_un server_addr, client_addr;
sockfd = Socket(AF_LOCAL, SOCK_DGRAM, 0);
memset(&client_addr, 0, sizeof(client_addr));
client_addr.sun_family = AF_LOCAL;
strcpy(client_addr.sun_path, tmpnam(NULL));
Bind(sockfd, (struct sockaddr*)&client_addr, sizeof(client_addr));
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sun_family = AF_LOCAL;
strcpy(server_addr.sun_path, LOCAL_STRPATH);
do_client(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
return 0;
}
Unix域数据报服务器
#include "../Gnet.h"
void do_server(int udpfd)
{
ssize_t nread;
char buf[MAX_LINE];
struct sockaddr_un client_addr;
socklen_t client_addr_len;
while(1)
{
client_addr_len = sizeof(client_addr);
nread = recvfrom(udpfd, buf, MAX_LINE, 0, (struct sockaddr*)&client_addr, &client_addr_len);
sendto(udpfd, buf, nread, 0, (struct sockaddr*)&client_addr, client_addr_len);
}
}
int main(int argc, const char* argv[])
{
int udpfd;
struct sockaddr_un server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sun_family = AF_LOCAL;
strcpy(server_addr.sun_path, LOCAL_STRPATH);
udpfd = Socket(AF_LOCAL, SOCK_DGRAM, 0);
unlink(LOCAL_STRPATH);
Bind(udpfd, (const struct sockaddr*)&server_addr, sizeof(server_addr));
printf("waiting for connecting.n");
do_server(udpfd);
return 0;
}
github:https://github.com/gongluck/unp-notes
- python mongodb爬取58网站
- 洛谷P1143 进制转换
- python爬取链家租房之获取北京所有区的网站分栏地址(第一次写,code太粗犷,欢迎提建议)
- Pandas-Series知识点总结
- Numpy基础知识点汇总
- P3388 【模板】割点(割顶)
- python爬取链家租房之获取房屋的链接和页面的详细信息
- 信用卡“坏账”客户分析(一)
- 一道简单的sql语句题
- python爬虫反爬取---设置User Agent自动变换header文件
- 一文读懂Python多线程
- 深入理解Python变量作用域与函数闭包
- TensorFlow从1到2 - 5 - 非专家莫入!TensorFlow实现CNN
- JetBrains Rider 破解 (ideaIU等等开发工具都通用)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 带你彻底搞懂-View的工作原理!
- Python 批量下载BiliBili视频 打包成软件
- 必要掌握!Window、WindowManager !
- 面试必备:ThreadLocal+Looper+Handler
- 子线程 真的不能更新UI ?
- Web前端开发 HTML设计 经验与技巧总结
- [OHIF-Viewers]医疗数字阅片-医学影像-辅助工具-Redux DevTools-DevTools for Redux with hot reloading, action replay,
- 全面理解:Android中的线程及线程池
- Ubuntu系统 安装与配置 常见异常与解决办法
- [OHIF-Viewers]医疗数字阅片-医学影像-Module: Panel-自定义面板-中二-Redux&react-redux状态管理详解
- Bitmap的加载和Cache
- Python全栈 Linux基础之2.Linux终端命令简介
- Ubuntu系统 使用与开发 常见异常与解决办法
- 淘宝首页Bug!嵌套滑动及NestedScroll
- 曝光埋点方案:recyclerView中的item曝光逻辑实现