给我提供一份基于C++用于通讯交流的Socket服务端和Socket客户端代码,并给每一行代码标上注释
时间: 2024-03-21 15:43:19 浏览: 67
c++ socket编程实例(服务端及客户端)
5星 · 资源好评率100%
好的,以下是基于C++的Socket服务端和Socket客户端代码,每一行代码都有注释解释:
服务端代码:
```c++
#include <iostream>
#include <winsock2.h> // 包含Winsock头文件
#pragma comment(lib, "ws2_32.lib") // 引入Winsock库
using namespace std;
int main()
{
WSADATA wsaData; // 定义WSADATA结构体
SOCKET ServerSocket; // 定义服务端Socket
SOCKADDR_IN ServerAddr; // 定义服务端地址
int iRet = WSAStartup(MAKEWORD(2, 2), &wsaData); // 初始化Winsock库
if (iRet != 0) {
cout << "WSAStartup error!" << endl;
return 0;
}
ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 创建服务端Socket
if (ServerSocket == INVALID_SOCKET) {
cout << "Create socket error!" << endl;
WSACleanup(); // 释放Winsock库
return 0;
}
ServerAddr.sin_family = AF_INET; // 指定地址族为IPv4
ServerAddr.sin_port = htons(6000); // 指定端口号为6000
ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY); // 指定IP地址为本机任意可用地址
iRet = bind(ServerSocket, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr)); // 绑定服务端Socket和地址
if (iRet == SOCKET_ERROR) {
cout << "Bind error!" << endl;
closesocket(ServerSocket); // 关闭服务端Socket
WSACleanup(); // 释放Winsock库
return 0;
}
iRet = listen(ServerSocket, SOMAXCONN); // 监听服务端Socket
if (iRet == SOCKET_ERROR) {
cout << "Listen error!" << endl;
closesocket(ServerSocket); // 关闭服务端Socket
WSACleanup(); // 释放Winsock库
return 0;
}
cout << "Server is listening..." << endl;
SOCKET ClientSocket; // 定义客户端Socket
SOCKADDR_IN ClientAddr; // 定义客户端地址
int iAddrLen = sizeof(ClientAddr); // 客户端地址长度
ClientSocket = accept(ServerSocket, (SOCKADDR*)&ClientAddr, &iAddrLen); // 接受客户端连接请求
if (ClientSocket == INVALID_SOCKET) {
cout << "Accept error!" << endl;
closesocket(ServerSocket); // 关闭服务端Socket
WSACleanup(); // 释放Winsock库
return 0;
}
cout << "Client is connected!" << endl;
char szRecvBuf[1024] = { 0 }; // 接收数据缓冲区
iRet = recv(ClientSocket, szRecvBuf, sizeof(szRecvBuf), 0); // 接收客户端数据
if (iRet == SOCKET_ERROR) {
cout << "Recv error!" << endl;
closesocket(ClientSocket); // 关闭客户端Socket
closesocket(ServerSocket); // 关闭服务端Socket
WSACleanup(); // 释放Winsock库
return 0;
}
cout << "Received message: " << szRecvBuf << endl;
closesocket(ClientSocket); // 关闭客户端Socket
closesocket(ServerSocket); // 关闭服务端Socket
WSACleanup(); // 释放Winsock库
return 0;
}
```
客户端代码:
```c++
#include <iostream>
#include <winsock2.h> // 包含Winsock头文件
#pragma comment(lib, "ws2_32.lib") // 引入Winsock库
using namespace std;
int main()
{
WSADATA wsaData; // 定义WSADATA结构体
SOCKET ClientSocket; // 定义客户端Socket
SOCKADDR_IN ServerAddr; // 定义服务端地址
int iRet = WSAStartup(MAKEWORD(2, 2), &wsaData); // 初始化Winsock库
if (iRet != 0) {
cout << "WSAStartup error!" << endl;
return 0;
}
ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 创建客户端Socket
if (ClientSocket == INVALID_SOCKET) {
cout << "Create socket error!" << endl;
WSACleanup(); // 释放Winsock库
return 0;
}
ServerAddr.sin_family = AF_INET; // 指定地址族为IPv4
ServerAddr.sin_port = htons(6000); // 指定端口号为6000
ServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 指定IP地址为本机IP地址
iRet = connect(ClientSocket, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr)); // 连接服务端Socket
if (iRet == SOCKET_ERROR) {
cout << "Connect error!" << endl;
closesocket(ClientSocket); // 关闭客户端Socket
WSACleanup(); // 释放Winsock库
return 0;
}
cout << "Connected to server!" << endl;
char szSendBuf[] = "Hello, server!"; // 发送数据缓冲区
iRet = send(ClientSocket, szSendBuf, sizeof(szSendBuf), 0); // 发送数据到服务端
if (iRet == SOCKET_ERROR) {
cout << "Send error!" << endl;
closesocket(ClientSocket); // 关闭客户端Socket
WSACleanup(); // 释放Winsock库
return 0;
}
cout << "Sent message: " << szSendBuf << endl;
closesocket(ClientSocket); // 关闭客户端Socket
WSACleanup(); // 释放Winsock库
return 0;
}
```
以上为基于C++的Socket服务端和Socket客户端代码,代码中有详细的注释,希望能帮助你。
阅读全文