一、代码
1、windows上的服务端代码:
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
int main() {
WSADATA wsaData;
int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (result != 0) {
std::cerr << "WSAStartup failed: " << result << std::endl;
return 1;
}
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serverSocket == INVALID_SOCKET) {
std::cerr << "Error at socket(): " << WSAGetLastError() << std::endl;
WSACleanup();
return 1;
}
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("192.168.150.1");
serverAddr.sin_port = htons(12345); // 服务器端口号
if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
std::cerr << "Bind failed with error: " << WSAGetLastError() << std::endl;
closesocket(serverSocket);
WSACleanup();
return 1;
}
if (listen(serverSocket, 5) < 0) {
std::cerr << "Listen failed with error: " << WSAGetLastError() << std::endl;
closesocket(serverSocket);
WSACleanup();
return 1;
}
std::cout << "Server started, listening on port 12345..." << std::endl;
sockaddr_in clientAddr;
int clientAddrSize = sizeof(clientAddr);
SOCKET clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrSize);
if (clientSocket == INVALID_SOCKET) {
std::cerr << "Accept failed with error: " << WSAGetLastError() << std::endl;
closesocket(serverSocket);
WSACleanup();
return 1;
}
char buffer[256] = { 0 };
int bytesReceived = recv(clientSocket, buffer, sizeof(buffer) - 1, 0);
if (bytesReceived > 0) {
buffer[bytesReceived] = '\0';
std::cout << "Received from client: " << buffer << std::endl;
const char* response = "Hello from Windows Server!";
send(clientSocket, response, strlen(response), 0);
std::cout << "Sent to client: " << response << std::endl;
}
else {
std::cerr << "recv failed with error: " << WSAGetLastError() << std::endl;
}
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
return 0;
}
开发环境如果是Visual Studio 2022,则会出现下面的报错--error C4996:
error C4996: 'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings
当出现该错误时,可通过如下操作消除该错误:项目属性->C/C++->常规->SDL检查=否(/std-);具体可看解释!
2、Linux上的客户端代码
import socket
def start_client():
# 创建socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置服务器IP地址和端口号
server_address = ('192.168.150.1', 12345) # 替换<Windows_Server_IP>为Windows服务器的IP地址
print(f"Connecting to {server_address}")
try:
# 连接到服务器
client_socket.connect(server_address)
# 发送数据
message = "Hello from Linux Client!"
client_socket.sendall(message.encode())
print(f"Sent: {message}")
# 接收响应
data = client_socket.recv(1024)
print(f"Received: {data.decode()}")
finally:
# 关闭连接
client_socket.close()
if __name__ == "__main__":
start_client()
二、结果
1、服务端
2、客户端