下面是一个简单的tcp网络通信demo。
客户端:
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <iostream>
#include <string>
#pragma comment(lib, ws2_32.lib)
#define IP "192.168.0.100"
#define PORT 5555
void Cleanup(SOCKET socket)
{
closesocket(socket);
WSACleanup();
}
int main()
{
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2, 2);
if (WSAStartup(wVersionRequested, &wsaData) != 0)
{
std::cout << "加载winsock.dll失败!" << std::endl;
return 0;
}
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == INVALID_SOCKET)
{
std::cout << "创建套接字失败!错误代码:!" << WSAGetLastError() << std::endl;
Cleanup(clientSocket);
return 0;
}
sockaddr_in serverAddress;
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(PORT);
inet_pton(AF_INET, IP, &serverAddress.sin_addr);
if (connect(clientSocket, reinterpret_cast<SOCKADDR*>(&serverAddress), sizeof(serverAddress)) == SOCKET_ERROR)
{
std::cout << "连接失败!错误代码:" << WSAGetLastError() << std::endl;
Cleanup(clientSocket);
return 0;
}
while (true)
{
std::string receivedMessage;
char buffer[1000];
int size = recv(clientSocket, buffer, sizeof(buffer) - 1, 0);
if (size <= 0)
{
if (size == 0)
std::cout << "连接已关闭" << std::endl;
else
std::cout << "接收信息失败!错误代码:" << WSAGetLastError() << std::endl;
break;
}
buffer[size] = '\0';
receivedMessage = buffer;
if (receivedMessage == "end")
{
std::cout << "服务器端已关闭连接!" << std::endl;
break;
}
else
{
std::cout << "收到服务器消息:" << receivedMessage << std::endl;
}
std::string sendMessage;
std::cout << "请输入要发送给服务器的消息:" << std::endl;
std::getline(std::cin, sendMessage);
if (sendMessage == "end")
{
std::cout << "关闭连接!" << std::endl;
break;
}
int sentBytes = send(clientSocket, sendMessage.c_str(), static_cast<int>(sendMessage.length()), 0);
if (sentBytes == SOCKET_ERROR || sentBytes == 0)
{
std::cout << "[发送信息失败] 错误代码: " << WSAGetLastError() << std::endl;
break;
}
else
{
std::cout << " [信息发送成功] " << std::endl;
}
}
Cleanup(clientSocket);
return 0;
}
服务端:
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <iostream>
#include <string>
#include <thread>
#pragma comment(lib, ws2_32.lib)
#define PORT 5555
void Cleanup(SOCKET socket)
{
closesocket(socket);
WSACleanup();
}
void HandleClientCommunication(SOCKET clientSocket)
{
std::cout << "成功和" << clientSocket << "建立连接!" << std::endl;
while (true)
{
char buffer[1000];
std::cout << "服务器向" << clientSocket << "发送数据:" << std::endl;
std::cin.getline(buffer, sizeof(buffer));
std::string message = buffer;
int size = send(clientSocket, message.c_str(), static_cast<int>(message.length()), 0);
if (message == "end")
{
std::cout << "关闭和" << clientSocket << "的连接!" << std::endl;
break;
}
else if (size == SOCKET_ERROR || size == 0)
{
std::cout << "[发送信息失败] 错误代码:" << WSAGetLastError() << std::endl;
break;
}
else
{
std::cout << "[信息发送成功]" << std::endl;
}
memset(buffer, 0, sizeof(buffer));
int receivedBytes = recv(clientSocket, buffer, sizeof(buffer), 0);
if (receivedBytes == SOCKET_ERROR || receivedBytes == 0)
{
std::cout << clientSocket << "断开了连接!" << std::endl;
break;
}
else
{
std::cout << clientSocket << " 说: "<< buffer << std::endl;
}
}
closesocket(clientSocket);
}
int main()
{
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2, 2);
if (WSAStartup(wVersionRequested, &wsaData) != 0)
{
std::cout << "加载winsock.dll失败!" << std::endl;
return 0;
}
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == INVALID_SOCKET)
{
std::cout << "创建套接字失败!错误代码:" << WSAGetLastError() << std::endl;
WSACleanup();
return 0;
}
sockaddr_in serverAddress;
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(PORT);
inet_pton(AF_INET, "127.0.0.1", & serverAddress.sin_addr);
if (bind(serverSocket, reinterpret_cast<SOCKADDR*>(&serverAddress), sizeof(serverAddress)) == SOCKET_ERROR)
{
std::cout << "地址绑定失败!错误代码:" << WSAGetLastError() << std::endl;
Cleanup(serverSocket);
return 0;
}
if (listen(serverSocket, 0) == SOCKET_ERROR)
{
std::cout << "监听失败!错误代码:" << WSAGetLastError() << std::endl;
Cleanup(serverSocket);
return 0;
}
while (true)
{
sockaddr_in clientAddress;
int clientAddressSize = sizeof(clientAddress);
SOCKET clientSocket = accept(serverSocket, reinterpret_cast<SOCKADDR*>(&clientAddress), &clientAddressSize);
if (clientSocket != INVALID_SOCKET)
{
std::thread clientThread(HandleClientCommunication, clientSocket);
clientThread.detach(); // "分离线程,不等待线程结束"
}
}
Cleanup(serverSocket);
return 0;
}
注:需要在工程属性里,链接器-输入-附加依赖项手动添加对应的库
版权声明:本文为博主原创文章,转载请附上博文链接!