域套接字代码示例(2)
2015-12-27 17:48
232 查看
下面是使用域套接字进行进程间通信的典型代码。
客户端代码:
服务器代码:
客户端代码:
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/un.h> #include <iostream> #include <string.h> #include <stdio.h> using namespace std; int main(int argc, char *argv[]) { if (argc != 2) { cout << "usage: " << argv[1] << " message" << endl; return -1; } int iSockFd = socket(AF_UNIX, SOCK_DGRAM, 0); if (iSockFd < 0) { cerr << "fail to create socket" << endl; return -1; } sockaddr_un oAddr; memset(&oAddr, 0, sizeof(oAddr)); oAddr.sun_family = AF_UNIX; strncpy(oAddr.sun_path, tmpnam(NULL), sizeof(oAddr.sun_path) - 1); if (bind(iSockFd, (sockaddr *)&oAddr, sizeof(oAddr)) < 0) { cerr << "fail to bind" << endl; return -1; } sockaddr_un oSvrAddr; memset(&oSvrAddr, 0, sizeof(oSvrAddr)); oSvrAddr.sun_family = AF_UNIX; strncpy(oSvrAddr.sun_path, "unix_socket", sizeof(oSvrAddr.sun_path) - 1); sendto(iSockFd, argv[1], strlen(argv[1]), 0, (sockaddr *)&oSvrAddr, sizeof(oSvrAddr)); socklen_t iAddrLen = sizeof(oSvrAddr); char acRecvBuf[100]; ssize_t iRecvLen = recvfrom(iSockFd, acRecvBuf, sizeof(acRecvBuf), 0, (sockaddr *)&oSvrAddr, &iAddrLen); if (iRecvLen < 0) { cerr << "fail to recv" << endl; return -1; } acRecvBuf[iRecvLen] = 0; cout << "client recv: " << acRecvBuf << endl; return 0; }
服务器代码:
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/un.h> #include <iostream> using namespace std; int main() { int iSockFd = socket(AF_UNIX, SOCK_DGRAM, 0); if (iSockFd < 0) { cerr << "fail to create socket" << endl; return -1; } unlink("unix_socket"); sockaddr_un oAddr; memset(&oAddr, 0, sizeof(oAddr)); oAddr.sun_family = AF_UNIX; strcpy(oAddr.sun_path, "unix_socket"); if (bind(iSockFd, (sockaddr *)&oAddr, sizeof(oAddr)) < 0) { cerr << "fail to bind" << endl; return -1; } sockaddr_un oClientAddr; char acBuf[100]; while (true) { socklen_t iAddrLen = sizeof(oClientAddr); ssize_t iRecvLen = recvfrom(iSockFd, acBuf, sizeof(acBuf), 0, (sockaddr *)&oClientAddr, &iAddrLen); if (iRecvLen < 0) { cerr << "fail to recv" << endl; continue; } acBuf[iRecvLen] = 0; cout << "server recv: " << acBuf << ", client addr: " << oClientAddr.sun_path << endl; sendto(iSockFd, acBuf, iRecvLen, 0, (sockaddr *)&oClientAddr, iAddrLen); } return 0; }
相关文章推荐
- java笔记
- C语言中的可变参数函数 三个点“…”
- java关键字
- 域套接字代码示例(1)
- Spring初始化数据库
- 个人学习-java-数组的使用与注意
- JVM java虚拟机
- 重学Java之环境变量(path和classpath)
- C++模板学习
- Spring Data JPA入门
- Java基础之switch语句
- 问题分析-无界线程池误用导致OOM:java.lang.OutOfMemoryError:unable to create new native thread
- 课程设计源代码
- 浅谈如何在Eclipse下的Android工程配置Git的.gitignore文件
- python 内建模块
- C#-循环滚动字幕,timer,从左至右,从右至左,暂停---ShinePans
- 深入理解c#中的const 和readonly的区别滴呀;
- 编程社区分享,烧脑行动Come on.
- Spring AOP快速入门
- Java实现简单的DES加密解密