socket进程间通信
来源:互联网 发布:淘宝可以讲价吗 编辑:程序博客网 时间:2024/05/11 00:55
//----------------------------------------------------
//AUTHOR: lanyang123456
//DATE: 2014-10-20
//----------------------------------------------------
socket在主机间和进程间使用,方法类似,主要区别是进程间通信使用的是sockaddr_un,而主机间的通信使用的是sockadd_in。
struct sockaddr_un{ sa_family_t sun_family;//AF_UNIX,它是一个短整型 char sum_path[];//路径名 <pre name="code" class="cpp">};
struct sockaddr_in{ short int sin_family;//AF_INET unsigned short int sin_port;//端口号 struct in_addr sin_addr;//IP地址 };
而in_addr被定义为:
使用socket作为进程间通信方式,有什么注意事项?
(1) Server
(2) client
例子如下:
server
/*IPCsocket AF_UNIXserver*/#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h> #include <errno.h>#define UNIX_DOMAIN"/tmp/UNIX.domain"#define QUEUE_LEN5int main(void){ socklen_t clt_addr_len; int listen_fd; int com_fd; int ret; int i; char recv_buf[1024]; int len; struct sockaddr_un client_addr; struct sockaddr_un server_addr; listen_fd=socket(PF_UNIX, SOCK_STREAM, 0); if(listen_fd < 0) { perror("cannot create communication socket"); return -1; } //set server addr server_addr.sun_family = AF_UNIX; strncpy(server_addr.sun_path, UNIX_DOMAIN, sizeof(server_addr.sun_path) - 1); unlink(UNIX_DOMAIN); //bind sockfd & addr ret = bind(listen_fd, (struct sockaddr*)&server_addr,sizeof(server_addr)); if(ret == -1) { perror("cannot bind server socket"); close(listen_fd); unlink(UNIX_DOMAIN); return -1; } //listen sockfd ret = listen(listen_fd, 1); if(ret==-1) { perror("cannot listen the client connect request"); close(listen_fd); unlink(UNIX_DOMAIN); return -1; } //have connect request use accept len = sizeof(client_addr); com_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &len); if(com_fd < 0) { perror("cannot accept client connect request"); close(listen_fd); unlink(UNIX_DOMAIN); return -1; } //read and printf sent client info printf("---------------\n"); memset(recv_buf,0,1024); ret = read(com_fd, recv_buf, sizeof(recv_buf) - 1); if (ret <= 0) {printf("write error(%d) %s\n", errno, strerror(errno));close(com_fd); close(listen_fd); unlink(UNIX_DOMAIN); return -1; } printf("Message from client :%s\n", recv_buf); close(com_fd); close(listen_fd); unlink(UNIX_DOMAIN); return 0;}
client
/*IPCsocket AF_UNIXclient*/#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#include <errno.h>#define UNIX_DOMAIN "/tmp/UNIX.domain"int main(void){ int connect_fd; int ret; char snd_buf[1024]; int i; static struct sockaddr_un server_addr; //creat unix socket connect_fd=socket(AF_UNIX, SOCK_STREAM, 0); if(connect_fd<0) { perror("cannot create communication socket"); return 1; } server_addr.sun_family = AF_UNIX; strcpy(server_addr.sun_path, UNIX_DOMAIN); //connect server ret=connect(connect_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)); if(ret==-1) { perror("cannot connect to the server"); close(connect_fd); return 1; } memset(snd_buf, 0, 1024); strcpy(snd_buf, "message from client"); ret = write(connect_fd,snd_buf,sizeof(snd_buf)); if (ret <= 0) {printf("write error(%d) %s\n", errno, strerror(errno));close(connect_fd);return -1; } close(connect_fd); return 0;}
测试:
#./server
可通过一下命令查看结果
$ netstat -an | grep tmp/UNIX.domain
unix 2 [ ACC ] STREAM LISTENING 302051 /tmp/UNIX.domain
参考
http://blog.chinaunix.net/uid-26790551-id-3171897.html
http://blog.sina.com.cn/s/blog_9cd4235201019cy6.html
- 进程间通信-socket
- 进程间通信---------socket
- socket进程间通信
- socket进程间通信
- Socket进程间通信
- 进程间通信---Socket
- Socket 实现进程间通信
- socket实现进程间通信
- Linux 进程间通信 socket
- Socket进程间通信原理
- socket实现进程间通信
- UNIX SOCKET 进程间通信
- socket实现进程间通信
- linux socket 进程间通信
- 进程间通信 SOCKET Server
- 进程间通信 SOCKET Client
- Linux 进程间通信 socket
- Socket实现进程间通信
- 第八周项目5定期存款利息计算器
- http连接服务器的工具类
- ANDROID开发之SQLite详解
- 项目五 定期存款利息计算器
- 企业服务总线之双工异步通讯机
- socket进程间通信
- 20141020个人日志(mac下显示隐藏文件方法,判断字符串是否为数字的方法)
- MINA学习笔记二
- SQL索引原理
- SPOJ_AMR10D_Soccer Teams(DP)
- oracle索引,索引的建立、修改、删除
- 调整Redmine的用户显示格式
- sgu120:Arhipelago
- js字符串大小写转换的几种方法 【js字符串转换大小写】