windows网络编程
时间: 2023-06-24 18:05:15 浏览: 42
Windows网络编程主要使用Winsock(Windows Socket)API来实现。下面是一个简单的例子,演示如何创建一个客户端和服务器应用程序:
客户端:
```c++
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") // 链接ws2_32.lib库文件
int main()
{
// 初始化Winsock库
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
std::cerr << "WSAStartup failed. Error code: " << WSAGetLastError() << std::endl;
return 1;
}
// 创建socket
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (clientSocket == INVALID_SOCKET)
{
std::cerr << "Failed to create socket. Error code: " << WSAGetLastError() << std::endl;
WSACleanup();
return 1;
}
// 设置服务器地址和端口号
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务器IP地址
serverAddr.sin_port = htons(12345); // 服务器端口号
// 连接服务器
if (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
{
std::cerr << "Failed to connect to server. Error code: " << WSAGetLastError() << std::endl;
closesocket(clientSocket);
WSACleanup();
return 1;
}
// 发送数据
char buffer[1024] = "Hello, server!";
if (send(clientSocket, buffer, strlen(buffer), 0) == SOCKET_ERROR)
{
std::cerr << "Failed to send data to server. Error code: " << WSAGetLastError() << std::endl;
closesocket(clientSocket);
WSACleanup();
return 1;
}
// 关闭socket
closesocket(clientSocket);
// 清理Winsock库
WSACleanup();
return 0;
}
```
服务器:
```c++
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") // 链接ws2_32.lib库文件
int main()
{
// 初始化Winsock库
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
std::cerr << "WSAStartup failed. Error code: " << WSAGetLastError() << std::endl;
return 1;
}
// 创建socket
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serverSocket == INVALID_SOCKET)
{
std::cerr << "Failed to create socket. Error code: " << WSAGetLastError() << std::endl;
WSACleanup();
return 1;
}
// 设置本地地址和端口号
sockaddr_in localAddr;
localAddr.sin_family = AF_INET;
localAddr.sin_addr.s_addr = htonl(INADDR_ANY); // 本地IP地址
localAddr.sin_port = htons(12345); // 本地端口号
// 绑定socket到本地地址和端口号
if (bind(serverSocket, (sockaddr*)&localAddr, sizeof(localAddr)) == SOCKET_ERROR)
{
std::cerr << "Failed to bind socket. Error code: " << WSAGetLastError() << std::endl;
closesocket(serverSocket);
WSACleanup();
return 1;
}
// 监听socket
if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR)
{
std::cerr << "Failed to listen on socket. Error code: " << WSAGetLastError() << std::endl;
closesocket(serverSocket);
WSACleanup();
return 1;
}
std::cout << "Server is listening on port 12345..." << std::endl;
// 接受连接请求
sockaddr_in clientAddr;
int clientAddrLen = sizeof(clientAddr);
SOCKET clientSocket = accept(serverSocket, (sockaddr*)&clientAddr, &clientAddrLen);
if (clientSocket == INVALID_SOCKET)
{
std::cerr << "Failed to accept connection request. Error code: " << WSAGetLastError() << std::endl;
closesocket(serverSocket);
WSACleanup();
return 1;
}
std::cout << "Client is connected. IP address: " << inet_ntoa(clientAddr.sin_addr) << ", port: " << ntohs(clientAddr.sin_port) << std::endl;
// 接收数据
char buffer[1024];
int recvSize = recv(clientSocket, buffer, sizeof(buffer), 0);
if (recvSize == SOCKET_ERROR)
{
std::cerr << "Failed to receive data from client. Error code: " << WSAGetLastError() << std::endl;
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
return 1;
}
std::cout << "Received data from client: " << buffer << std::endl;
// 关闭socket
closesocket(clientSocket);
closesocket(serverSocket);
// 清理Winsock库
WSACleanup();
return 0;
}
```
以上是一个简单的例子,仅供参考。在实际应用中,可能需要处理更多的错误情况和异常情况,以保证程序的健壮性。