码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-07-16 21:23:46      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:net   ast   复杂   使用   blog   int   color   win   开发   

  从事网络方面的开发有一段时间了,每天在各种琐碎的事情中奔波,对我这种野路子出身的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++网络编程(1)——收发一个快递

标签:net   ast   复杂   使用   blog   int   color   win   开发   

原文地址:http://www.cnblogs.com/china-zyl/p/7191774.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!