理论/原理
待补充。。。
代码demo
服务端
server.cpp
#include <iostream>
#include <sys/socket.h> //套接字相关函数和结构
#include <sys/un.h> //Unix域套接字相关结构
#include <unistd.h>
using namespace std;
#define SOCKET_PATH "./socket"
int main()
{
//创建套接字
int serv_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (serv_sockfd == -1)
{
cerr << "套接字创建失败!" << endl;
return 1;
}
//绑定套接字到文件路径
struct sockaddr_un serv_addr;
memset(&serv_addr, 0, sizeof(struct sockaddr_un));
serv_addr.sun_family = AF_UNIX;
unlink(SOCKET_PATH); // 如果不unlink,则无法重新绑定
strncpy(serv_addr.sun_path, SOCKET_PATH, sizeof(serv_addr.sun_path)-1);
bind(serv_sockfd, (struct sockaddr*) &serv_addr, sizeof(struct sockaddr_un));
//监听连接
int res = listen(serv_sockfd, 5); //一般backlog >= 5
if (res == -1)
{
cerr << "Failed to listen" << endl;
close(serv_sockfd);
return 1;
}
while (true)
{
cout << "Waiting for client connection..." << endl;
//接受连接请求
int clientfd = accept(serv_sockfd, nullptr, nullptr);
if (clientfd == -1)
{
cerr << "Failed to accept connection" << endl;
close(serv_sockfd);
return 1;
}
cout << "Client connected!" << endl;
//进行数据读写
char buffer[1024];
ssize_t bytesRead = recv(clientfd, buffer, sizeof(buffer), 0); //接收数据
while (bytesRead > 0)
{
cout << "Received message from client: " << buffer << endl;
/*在此处,填写其他操作*/
string send_message = "I receive your message. ";
ssize_t bytesWritten = send(clientfd, send_message.c_str(), send_message.length(), 0); //发送数据 (发送回复给客户端)
if (bytesWritten == -1)
{
cerr << "Failed to send response to client" << endl;
close(clientfd);
break;
}
}
if (bytesRead == -1)
{
cerr << "Failed to receive data from client" << endl;
break;
}
cout << "Client disconnected" << endl;
close(clientfd);
}
//关闭套接字
close(serv_sockfd);
return 0;
}
客户端
client.cpp
#include <iostream>
#include <sys/socket.h> //套接字相关函数和结构
#include <sys/un.h> //Unix域套接字相关结构
#include <unistd.h>
#define SOCKET_PATH "./socket"
using namespace std;
int main()
{
//创建套接字
int client_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (client_sockfd == -1)
{
cerr << "Failed to create socket" << endl;
return 1;
}
//连接到服务器
struct sockaddr_un serv_addr;
memset(&serv_addr, 0, sizeof(struct sockaddr_un));
serv_addr.sun_family = AF_UNIX;
strncpy(serv_addr.sun_path, SOCKET_PATH, sizeof(serv_addr.sun_path)-1);
while (true)
{
while (true)
{
int res = connect(client_sockfd, (struct sockaddr*) &serv_addr, sizeof(struct sockaddr_un));
if (res == -1)
{
cerr << "Failed to connect to server, sleep 1s and reconnect..." << endl;
sleep(1);
continue;
}
break;
}
cout << "Connected to server!" << endl;
while (true)
{
string message = "client send a message ";
// 发送消息给服务器
ssize_t bytesWritten = send(client_sockfd, message.c_str(), message.length(), 0); //发送数据
if (bytesWritten == -1)
{
cerr << "Failed to send message to server" << endl;
break;
}
sleep(1);
//接收服务器的回复
char buffer[32];
ssize_t bytesRead = recv(client_sockfd, buffer, sizeof(buffer), 0); //接收数据
if (bytesRead == -1)
{
cerr << "Failed to receive response from server" << endl;
break;
}
// buffer[bytesRead] = '\0'; //?
cout << "Recevied response from server: " << buffer << endl;
}
}
}
运行方式
两个shell窗口,分别执行以下代码:
root@E02xx socket_unix % g++ client.cpp -o client && ./client
root@E02xx socket_unix % g++ server.cpp -o server && ./server