C++适配windows和linux下网络编程TCP简单案例

C++网络编程

网络协议是计算机网络中通信双方必须遵循的一套规则和约定,用于实现数据的传输、处理和控制。这些规则包括了数据格式、数据交换顺序、数据处理方式、错误检测和纠正等。网络协议是使不同类型的计算机和网络设备能够相互通信的基础,是网络通信的基石。

常见的网络协议:

  1. TCP/IP协议:TCP/IP(Transmission Control Protocol/Internet Protocol)协议是互联网的基础协议,包括了TCP(传输控制协议)和IP(互联网协议)等。TCP/IP协议族定义了网络中数据传输的规则,包括了数据包的封装、路由选择、数据传输、错误检测和校正等。

  2. HTTP协议:超文本传输协议(Hypertext Transfer Protocol)用于从万维网服务器传输超文本到本地浏览器的传输协议。HTTP协议是基于TCP/IP协议的,用于在浏览器和Web服务器之间进行通信。

  3. HTTPS协议:安全超文本传输协议(Hypertext Transfer Protocol Secure),是在HTTP的基础上加入了SSL/TLS协议,用于提供加密和身份验证的网络协议。HTTPS协议确保了数据在传输过程中的安全性和完整性。

  4. FTP协议:文件传输协议(File Transfer Protocol)用于在计算机之间传输文件。FTP协议允许用户从远程服务器下载文件或向远程服务器上传文件。

  5. SMTP协议:简单邮件传输协议(Simple Mail Transfer Protocol)用于在电子邮件服务器之间传输邮件。SMTP协议定义了邮件服务器如何发送和接收邮件的标准。

  6. DHCP协议:动态主机配置协议(Dynamic Host Configuration Protocol)用于自动分配IP地址、子网掩码、默认网关等信息给网络设备,简化了网络设备的配置过程。

  7. DNS协议:域名系统(Domain Name System)协议用于将域名转换为IP地址,使得用户可以通过易于记忆的域名访问网络资源,而不是直接使用IP地址。

协议的作用:

  • 数据传输:确保数据能够从发送方正确传输到接收方。
  • 错误检测与纠正:通过校验和、CRC(循环冗余校验)等机制检测数据传输过程中的错误,并尝试纠正这些错误。
  • 资源管理:控制网络资源的使用,如带宽分配、优先级设置等。
  • 安全性:通过加密、认证、授权等机制保护数据传输的安全性。
  • 兼容性:确保不同类型的设备和系统能够相互通信,实现互操作性。

网络协议的复杂性体现在它们需要在高效性、可靠性和安全性之间找到平衡,同时还要考虑到不同设备和应用的具体需求。随着技术的发展,新的网络协议不断涌现,以满足日益增长的网络通信需求。

1、windwos和linux代码案例

Service.cpp

#include <iostream>
#include <string>

#ifdef __linux__
// Linux平台相关代码
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#elif defined(_WIN32)
// Windows平台相关代码

#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#else
// 其他平台处理
#endif


int main() {
#ifdef  __linux__
    // 创建socket
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd == -1) {
        std::cerr << "Error creating socket\n";
        return 1;
    }

    // 绑定IP和端口
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(8888);

    if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        std::cerr << "Binding failed\n";
        return 1;
    }

    // 开始监听
    listen(server_fd, 5);

    // 等待连接
    int client_fd = accept(server_fd, NULL, NULL);
    if (client_fd < 0) {
        std::cerr << "Error accepting connection\n";
        return 1;
    }

    // 从客户端接收数据
    char buffer[1024] = { 0 };
    read(client_fd, buffer, 1024);
    std::cout << "Received: " << buffer << std::endl;

    // 发送数据到客户端
    std::string response = "Hello from server";
    send(client_fd, response.c_str(), response.size(), 0);

    // 关闭连接
    close(client_fd);
    close(server_fd);

#elif defined(_WIN32)
    // Initialize Winsock
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        std::cerr << "WSAStartup failed with error: " << iResult << std::endl;
        return 1;
    }

    // Create a TCP server socket
    SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (serverSocket == INVALID_SOCKET) {
        std::cerr << "Error creating server socket" << std::endl;
        WSACleanup();
        return 1;
    }

    // Bind the socket to a port
    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(12345); // Port number
    if (bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
        std::cerr << "Bind failed with error" << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return 1;
    }

    // Listen for incoming connections
    if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) {
        std::cerr << "Listen failed with error" << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return 1;
    }

    // Accept a client connection
    SOCKET clientSocket = accept(serverSocket, NULL, NULL);
    if (clientSocket == INVALID_SOCKET) {
        std::cerr << "Accept failed with error" << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return 1;
    }

    // Send data to the client
    std::string message = "Hello, client!";
    send(clientSocket, message.c_str(), message.size(), 0);

    // Close the sockets
    closesocket(clientSocket);
    closesocket(serverSocket);
    WSACleanup();
#else

#endif //  __linux__
 
    return 0;
}
}

Client.cpp

#include <iostream>
#include <string>

#ifdef __linux__
// Linux平台相关代码
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#elif defined(_WIN32)
// Windows平台相关代码

#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#else
// 其他平台处理
#endif

int main() {

#ifdef __linux__
    // Linux平台相关代码
    // 创建socket
    int client_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (client_fd == -1) {
        std::cerr << "Error creating socket\n";
        return 1;
    }

    // 连接到服务器
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8888);

    if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) <= 0) {
        std::cerr << "Invalid address\n";
        return 1;
    }

    if (connect(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        std::cerr << "Connection failed\n";
        return 1;
    }

    // 发送数据到服务器
    std::string message = "Hello from client";
    send(client_fd, message.c_str(), message.size(), 0);

    // 接收服务器响应
    char buffer[1024] = { 0 };
    read(client_fd, buffer, 1024);
    std::cout << "Server response: " << buffer << std::endl;

    // 关闭连接
    close(client_fd);

#elif defined(_WIN32)
    // Windows平台相关代码
     // Initialize Winsock
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        std::cerr << "WSAStartup failed with error: " << iResult << std::endl;
        return 1;
}

    // Create a TCP client socket
    SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (clientSocket == INVALID_SOCKET) {
        std::cerr << "Error creating client socket" << std::endl;
        WSACleanup();
        return 1;
    }

    // Connect to the server
    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // Server IP address
    serverAddr.sin_port = htons(12345); // Port number
    if (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
        std::cerr << "Connect failed with error" << std::endl;
        closesocket(clientSocket);
        WSACleanup();
        return 1;
    }

    // Receive data from the server
    char buffer[1024] = { 0 };
    recv(clientSocket, buffer, 1024, 0);
    std::cout << "Server says: " << buffer << std::endl;

    // Close the socket
    closesocket(clientSocket);
    WSACleanup();

#else
    // 其他平台处理
#endif
   
    return 0;
}

result:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴躁茹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值