1. 程式人生 > >C++網絡編程(1)——收發一個快遞

C++網絡編程(1)——收發一個快遞

無法 system initial blog 每天 span comm char 出身

  從事網絡方面的開發有一段時間了,每天在各種瑣碎的事情中奔波,對我這種野路子出身的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)——收發一個快遞