C++网络编程——收发一个快递

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++网络编程——收发一个快递相关的知识,希望对你有一定的参考价值。

  从事网络方面的开发有一段时间了,每天在各种琐碎的事情中奔波,对我这种野路子出身的C++程序员,感觉总是欠缺点什么。

  终于,思量再三,准备结束这繁杂却无法前进寸步的工作,也暂时给自己一些时间,梳理一下自己摸索网络开发的一些东西,从简单到复杂,一步一步的进阶。希望能让自己更进一步,也希望能帮助一些和我当年一样懵逼的同行们,坚持就是胜利!

 

下面来看一个简单的示例:

server.cpp

#include <iostream>
#include <WinSock2.h>

using namespace std;

#pragma comment(lib,"ws2_32.lib")


//初始化Socket资源
int Initialization()
{
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2),&wsaData) != NO_ERROR)
    {
        cout << "初始化失败!" << endl;
        return 0;
    }
    return 1;
}

int main()
{
    if (Initialization() == 0)
    {
        return 0;
    }

    SOCKET sockSvr;
    SOCKADDR_IN addrSvr;
    //收发快递,要保证我们有一个收件人
    sockSvr = socket(AF_INET, SOCK_STREAM, 0);
    //收件人可以选择接受哪个地区发来的快递
    addrSvr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    //收件人可以选择接受哪种方式发来的快递(udp/tcp)
    addrSvr.sin_family = AF_INET;
    //收件人有一个固定的房间(端口)收取快递
    addrSvr.sin_port = htons(6000);
    //将收件人的各种信息告知快递商
    bind(sockSvr, (SOCKADDR*)&addrSvr, sizeof(SOCKADDR));
    //快递商留意收件人的快递
    listen(sockSvr, 5);
    std::cout << "激动的等待远方朋友的快递..." << std::endl;

    int nLen = sizeof(SOCKADDR);

    char cSendBuf[128] = { 0 };
    char cRecvBuf[128] = { 0 };

    SOCKADDR_IN addrClient;
    //当有快递到来,快递商将包裹保存于特定的位置
    SOCKET sockClient = accept(sockSvr, (SOCKADDR*)&addrClient, &nLen);
    //收件人从这个位置取到自己的包裹
    int nRecvLen = recv(sockClient, cRecvBuf, 128, 0);

    cout << "开心的取到了包裹:" << cRecvBuf << endl;

    memcpy(cSendBuf, cRecvBuf, strlen(cRecvBuf) + 1);
    //收件人根据寄件信息,回复
    send(sockClient, cSendBuf, strlen(cSendBuf) + 1, 0);

    closesocket(sockClient);
    WSACleanup();

    system("pause");
    return 0;
}

client.cpp

#include <iostream>
#include <WinSock2.h>

using namespace std;

#pragma comment(lib,"ws2_32.lib")


//初始化Socket资源
int Initialization()
{
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != NO_ERROR)
    {
        cout << "初始化失败!" << endl;
        return 0;
    }
    return 1;
}

int main()
{
    if (Initialization() == 0)
    {
        return 0;
    }
    SOCKET sockClient;
    SOCKADDR_IN addrSvr;
    //收发快递同样需要一个寄件人
    sockClient = socket(AF_INET, SOCK_STREAM, 0);
    //寄件人需要知道收件人的地址
    addrSvr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    //寄件人需要知道收件人收取什么邮寄方式的快递
    addrSvr.sin_family = AF_INET;
    //寄件人需要知道收件人在哪个房间收取快递
    addrSvr.sin_port = htons(6000);
    //快递商通过寄件人给的信息,检查是否有误
    if (connect(sockClient, (SOCKADDR*)&addrSvr, sizeof(SOCKADDR)) == SOCKET_ERROR)
    {
        return 0;
    }

    char cSendBuf[128] = "Hello!";
    //将快递根据收件人信息发送出去
    send(sockClient, cSendBuf, strlen(cSendBuf) + 1, 0);
    char cRecvBuf[128] = { 0 };
    recv(sockClient, cRecvBuf, 128, 0);
    cout << cRecvBuf << endl;
    system("pause");
    return 0;
}

示例中,描述了socket网络编程基本的实现方式,从使用wsastartup选择需要的socket版本,到socket的创建、地址和端口的选择、协议的确定、接收和发送函数等等。

后续的文章,将对此逐一进行详细的讲解。

 

以上是关于C++网络编程——收发一个快递的主要内容,如果未能解决你的问题,请参考以下文章

基于android的校园快递查询收取寄件app

C++ 代码片段(积累)

这些 C++ 代码片段有啥作用?

有趣的 C++ 代码片段,有啥解释吗? [复制]

以下代码片段 C++ 的说明

2022华为机试真题 C++ 实现快递运输