Linux socket本地进程间通信之UDP
2015-12-06 22:53
726 查看
当套接字用于本地通信时,可以使用结构体struct sockaddr_un描述一个本地地址。
在本地通信中,每个套接字文件代表一个本地地址。
UNIX域用户数据报套接字服务器端流程如下:
(1)创建UNIX域数据报套接字;socket(AF_LOCAL, SOCK_DGRAM, 0)
(2)填充本地信息结构体(服务器);struct sockaddr_un
(3)绑定本地地址(服务器的地址信息);bind( )
(4)接收客户端的数据;recvfrom( )
(5)发送数据给客户端;sendto( )
服务器端代码如下:
server.c
UNIX域用户数据报套接字客户端流程如下:
(1)创建UNIX域数据报套接字;socket(AF_LOCAL, SOCK_DGRAM, 0)
(2)填充本地信息结构体(服务器端和客户端);struct sockaddr_un
(3)绑定本地地址(客户端的地址信息);bind( )
(4)发送数据给服务器端;sendto( )
(5)接收服务器端的数据;recvfrom( )
客户端代码如下:
client.c
客户端运行结果如下:
服务器端运行结果如下:
struct sockaddr_un{ unsigned short sun_family; /*协议类型*/ char sun_path[108]; /*套接字文件路径*/ };
在本地通信中,每个套接字文件代表一个本地地址。
UNIX域用户数据报套接字服务器端流程如下:
(1)创建UNIX域数据报套接字;socket(AF_LOCAL, SOCK_DGRAM, 0)
(2)填充本地信息结构体(服务器);struct sockaddr_un
(3)绑定本地地址(服务器的地址信息);bind( )
(4)接收客户端的数据;recvfrom( )
(5)发送数据给客户端;sendto( )
服务器端代码如下:
server.c
#include<stdio.h> #include<sys/types.h> #include<unistd.h> #include<sys/socket.h> #include<arpa/inet.h> #include<netinet/in.h> #include<string.h> #include<sys/un.h> #include<stdlib.h> #define N 64 int main(int argc, const char *argv[]) { int sockfd; struct sockaddr_un serveraddr, clientaddr; char buf ; socklen_t len = sizeof(clientaddr); sockfd = socket(AF_LOCAL, SOCK_DGRAM, 0); if(sockfd < 0) { perror("fail to sockfd"); return -1; } serveraddr.sun_family = AF_LOCAL; strcpy(serveraddr.sun_path, "mysocket"); if(bind(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0) { perror("fail to bind"); return -1; } while(1) { if(recvfrom(sockfd, buf, N, 0, (struct sockaddr*)&clientaddr, &len) < 0) { perror("fail to recvfrom"); return -1; } if(strncmp(buf, "quit", 4) == 0) { break; } buf[strlen(buf) - 1] = '\0'; printf("buf:%s\n", buf); strcat(buf, "++++----"); if(sendto(sockfd, buf, N, 0, (struct sockaddr*)&clientaddr, sizeof(clientaddr)) < 0) { perror("fail to sendto"); return -1; } } close(sockfd); return 0; }
UNIX域用户数据报套接字客户端流程如下:
(1)创建UNIX域数据报套接字;socket(AF_LOCAL, SOCK_DGRAM, 0)
(2)填充本地信息结构体(服务器端和客户端);struct sockaddr_un
(3)绑定本地地址(客户端的地址信息);bind( )
(4)发送数据给服务器端;sendto( )
(5)接收服务器端的数据;recvfrom( )
客户端代码如下:
client.c
#include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<unistd.h> #include<sys/socket.h> #include<arpa/inet.h> #include<netinet/in.h> #include<sys/un.h> #include<string.h> #define N 64 int main(int argc, const char *argv[]) { int sockfd; char buf ; struct sockaddr_un serveraddr, clientaddr; sockfd = socket(AF_LOCAL, SOCK_DGRAM, 0); if(sockfd < 0) { perror("fail to sockfd"); return -1; } serveraddr.sun_family = AF_LOCAL; strcpy(serveraddr.sun_path, "mysocket"); clientaddr.sun_family = AF_LOCAL; strcpy(clientaddr.sun_path, "socket"); if(bind(sockfd, (struct sockaddr*)&clientaddr, sizeof(clientaddr)) < 0) { perror("fail to bind"); return -1; } while(1) { printf("<client>"); fgets(buf, N, stdin); if(sendto(sockfd, buf, N, 0, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0) { perror("fail to sendto"); return -1; } if(strncmp(buf, "quit", 4) == 0) { break; } if(recvfrom(sockfd, buf, N, 0, NULL, NULL) < 0) { perror("fail to recvfrom"); return -1; } printf("buf:%s\n", buf); } close(sockfd); return 0; }
客户端运行结果如下:
服务器端运行结果如下:
相关文章推荐
- Linux命令
- GNU Linux解析域名的三种命令及用法
- Linux(12.1-12.6)学习笔记
- Linux(12.1-12.6)学习笔记
- Linux + C + Epoll实现高并发服务器(线程池 + 数据库连接池)
- 在CentOS里使用MySQL Connector/C++
- 在CentOS里使用MySQL C API
- Linux下程序中获得对应的密码
- 常用linux系统分析工具总结
- Linux下hosts、host.conf、resolv.conf的区别
- 所有操作系统下载地址Windows Redhat CentOS
- 嵌入式Linux-linux连接脚本
- linux signal(1)
- express 在centos上运行(安装node)
- Centos编译Hadoop 2.x 源码
- Linux iptables常见防护攻击措施
- ftp vsftpd服务器安装(云虚拟机Centos 7.0)
- Linux版Matlab R2015b的bug——脚本运行的陷阱(未解决)
- Linux安装教程
- linux下 lvm 磁盘扩容