windows主机与虚拟机上运行的Linux系统基于tcp/udp通信协议的网络通信!

一、代码

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、客户端

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值