使用C++写一个UNIX域套接字程序
时间: 2023-12-10 07:06:12 浏览: 79
好的,下面是一个简单的 C++ 程序,用于在 UNIX 域上进行套接字通信:
```cpp
#include <iostream>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <cstring>
const char* SOCKET_PATH = "/tmp/mysocket";
int main() {
// 创建套接字
int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sockfd == -1) {
std::cerr << "Failed to create socket" << std::endl;
return 1;
}
// 绑定到 socket 地址
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1);
if (bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
std::cerr << "Failed to bind socket" << std::endl;
close(sockfd);
return 1;
}
// 监听连接请求
if (listen(sockfd, 5) == -1) {
std::cerr << "Failed to listen on socket" << std::endl;
close(sockfd);
return 1;
}
// 等待客户端连接
int clientfd = accept(sockfd, nullptr, nullptr);
if (clientfd == -1) {
std::cerr << "Failed to accept client" << std::endl;
close(sockfd);
return 1;
}
// 读取客户端发送的数据
char buf[256];
int numBytes = read(clientfd, buf, sizeof(buf));
if (numBytes == -1) {
std::cerr << "Failed to read from client" << std::endl;
close(clientfd);
close(sockfd);
return 1;
}
// 打印接收到的数据
std::cout << "Received " << numBytes << " bytes: " << buf << std::endl;
// 关闭套接字
close(clientfd);
close(sockfd);
return 0;
}
```
在这个程序中,我们首先使用 `socket` 函数创建了一个 UNIX 域套接字。然后,我们使用 `bind` 函数将套接字绑定到一个本地地址上,这里我们使用了 `/tmp/mysocket` 作为地址。接下来,我们使用 `listen` 函数开始监听连接请求。当有客户端连接时,使用 `accept` 函数接受连接请求,并返回一个新的套接字,可以使用这个套接字与客户端进行通信。在这个程序中,我们只是简单地从客户端读取数据,并将其打印到标准输出流中。最后,我们关闭套接字并退出程序。
阅读全文