通过C++实现基于socket的TCP聊天服务器
·
什么是socket
socket是一套用于不同主机间的API。
IP地址用于唯一标识网络设备;端口用于区分主机上的不同应用(进程);
通过socket可以在不同主机不同应用之间建立一条虚拟通道;(点对点,应用对应用);
socket有两种类型,TCP(一对一数据流,不会丢包)和UDP(广播式);
服务器Server.cpp
1.创建一个socket, AF_INET表示使用的是IPV4地址,SOCK_STREAM表示使用的是TCP协议
SOCKET serverSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2.bind函数表示的是将我们的socket关联到我们的主机的网卡和端口上
bind(serverSock, (sockaddr*)&serverAddr, sizeof(serverAddr));
3.listen函数将我们的socket设置为监听状态,等待客户端的连接
listen(serverSock, 5);
4.接受任意客户端的连接,并返回一个新的socket和IP地址
sockaddr_in clientAddr;
int addrLen = sizeof(clientAddr);
SOCKET clientSock = accept(serverSock, (sockaddr*)&clientAddr, &addrLen);
5.配置客户端功能
char recvBuf[BUF_SIZE];
while (true)
{
// 接收客户端消息
ZeroMemory(recvBuf, BUF_SIZE);
int ret = recv(clientSock, recvBuf, BUF_SIZE, 0);
if (ret <= 0)
{
cout << "客户端断开连接" << endl;
break;
}
cout << "客户端:" << recvBuf << endl;
// 服务器回复消息
string sendMsg;
cout << "输入回复:";
getline(cin, sendMsg);
send(clientSock, sendMsg.c_str(), sendMsg.length(), 0);
}
客户端Client.cpp
1.同样创建一个socket
SOCKET clientSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2.配置好服务器的IP地址和端口号
sockaddr_in serverAddr{};
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
serverAddr.sin_addr.S_un.S_addr = inet_addr(SERVER_IP);
3.连接服务器
connect(clientSock, (sockaddr*)&serverAddr, sizeof(serverAddr));
cout << "已连接聊天服务器!" << endl;
4.配置客户端功能
char recvBuf[BUF_SIZE];
while (true)
{
// 发送消息给服务器
string sendMsg;
cout << "输入消息:";
getline(cin, sendMsg);
send(clientSock, sendMsg.c_str(), sendMsg.length(), 0);
// 接收服务器回复
ZeroMemory(recvBuf, BUF_SIZE);
recv(clientSock, recvBuf, BUF_SIZE, 0);
cout << "服务器:" << recvBuf << endl;
}
实现结果


更多推荐

所有评论(0)