10 UNIX域协议
来源:互联网 发布:数码宝贝5 知乎 编辑:程序博客网 时间:2024/06/13 13:40
UNIX域套接字地址结构
#include <sys/un.h>
struct sockaddr_un { sa_family sun_family; char sun_path[104];}
套接字函数
1、路径最好是绝对路径,不要相对路径;
2、和connect调用中指定的路径名必须是一个当前绑定在某个打开的UNIX域套接字上的路径名,而且他们的套接字类型(字节流或数据报)也必须一致;
3、在一个未绑定的Unix域套接字上发送数据报不会自动给这个套接字捆绑一个路径名,这点不同于UDP套接字(对于UDP套接字,会自动绑定一个临时端口),所以对于数据报UNIX域套接字客户端,则必须调用bind。
UNIX域字节流客户端/服务端
客户端:
#include <sys/un.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h> /*for struct sockaddr_in*/#define PATH "/home/unix_sock_xxxxx"#define MAX_BUF_LEN 255int main() { int sockfd = 0; sockfd = socket(AF_LOCAL, SOCK_STREAM, 0); struct sockaddr_un addr; memset(&addr, 0, sizeof(struct sockaddr_un)); addr.sun_family = AF_LOCAL; strncpy(addr.sun_path, PATH, sizeof(addr.sun_path) - 1); connect(sockfd, (struct sockaddr*)&addr, sizeof(addr)); printf("client is on...\n"); int i = 0; for (i = 0; i < 5; i++) { char * msg = "hello server...."; printf("client send msg: %s\n", msg); if((send(sockfd, msg, strlen(msg), 0))<0) { perror("send()"); } char recv_buf[MAX_BUF_LEN] = {0}; int recv_len = recv(sockfd, recv_buf, sizeof(recv_buf), 0); printf("client recv msg: %s\n", recv_buf); } return 1;}
服务端:
#include <sys/un.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h> /*for struct sockaddr_in*/#define PATH "/home/unix_sock_xxxxx"#define BACKLOG 10 #define MAX_BUF_LEN 255int main() { int listenfd = 0; int connfd = 0; struct sockaddr_un svr_addr; struct sockaddr_un cli_addr; memset(&svr_addr, 0, sizeof(struct sockaddr_un)); memset(&cli_addr, 0, sizeof(struct sockaddr_un)); listenfd = socket(AF_LOCAL, SOCK_STREAM, 0); unlink(PATH); svr_addr.sun_family = AF_LOCAL; strncpy(svr_addr.sun_path, PATH, sizeof(svr_addr.sun_path) - 1); bind(listenfd, (struct sockaddr*)&svr_addr, SUN_LEN(&svr_addr)); listen(listenfd, BACKLOG); printf("server is on...\n"); int cli_len = sizeof(cli_addr); connfd = accept(listenfd, (struct sockaddr*)&cli_addr, &cli_len); char recv_buf[MAX_BUF_LEN] = {0}; int recv_len = 0; while((recv_len = recv(connfd, recv_buf, sizeof(recv_buf), 0)) > 0) { printf("svr %d recv %s recv_len %d\n", connfd, recv_buf, recv_len); int ret = send(connfd, recv_buf, strlen(recv_buf), 0); if (ret < 0) { perror("send failed"); exit(1); } memset(recv_buf, 0, sizeof(recv_buf)); } return 1;}
总结:和普通tcp套接字相比,不同点有family为AF_LOCAL,地址类型为sockaddr_un,同时宏SUN_LEN返回的是不包括空字符的结构体长度。其它基本一样。
- 10 UNIX域协议
- Unix域协议
- Unix域协议
- UNIX域协议
- Unix域协议简介
- 16.unix域协议
- UNIX域协议
- Unix域协议
- UNIX domain ( UNIX 域协议 ) 实例
- 《UNIX网络编程 卷1》 笔记: UNIX域协议
- UNP函数笔记十二: Unix域协议
- Socket编程实践(13) --UNIX域协议
- Socket编程实践(13) --UNIX域协议
- UNPv1第十四章:Unix域协议
- Unix域协议--Linux本地IPC
- 第15章 Unix域协议
- Unix Netlink 协议
- unix域格式的协议族的简单socket编程
- JUnit 4 如何正确测试异常
- The connection to adb is down, and a severe error has occured.
- TestComplete使用全局变量(原创)
- 利用AsyncUdpSocket实现局域网下的IM(含Demo)
- Java 反射机制中 getMethod()和getDeclaredMethod()区别
- 10 UNIX域协议
- MAC系统下显示或者隐藏文件
- linux下编译内核
- 学用 ASP.Net 之 "字符串" (2): string.Format
- IT人士必去的10个网站
- dhcpd入门笔记
- 【转】操作系统内存管理机制
- gnu ucos-II 基于mini2440平台
- 网页布局中CSS无效的十个常见原因