国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

以u(píng)dp協(xié)議創(chuàng)建通信服務(wù)器

這篇具有很好參考價(jià)值的文章主要介紹了以u(píng)dp協(xié)議創(chuàng)建通信服務(wù)器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

概念圖

以u(píng)dp協(xié)議創(chuàng)建通信服務(wù)器,udp,服務(wù)器,網(wǎng)絡(luò)協(xié)議

?創(chuàng)建服務(wù)器讓A,B主機(jī)完成通信。

認(rèn)識(shí)接口

socket

以u(píng)dp協(xié)議創(chuàng)建通信服務(wù)器,udp,服務(wù)器,網(wǎng)絡(luò)協(xié)議

?返回值:套接字,你可以認(rèn)為類似fd

參數(shù):

  1. domain->:哪種套接字,常用AF_INET(網(wǎng)絡(luò)套接字)、AF_LOCAL(本地套接字)
  2. type->:發(fā)送數(shù)據(jù)類型,常用?SOCK_DGRAM(以數(shù)據(jù)報(bào)式發(fā)送)
  3. protocol->:一般填0,自動(dòng)推導(dǎo)類型或者IPPROTO_UDP、IPPROTO_TCP。

創(chuàng)建一個(gè)套接字,類似創(chuàng)建一個(gè)文件標(biāo)識(shí)符fd。

先介紹些結(jié)構(gòu)體類型

struct sockaddr
struct sockaddr_in
struct sockaddr_un

_in結(jié)構(gòu)體中保存的是ip\port數(shù)據(jù),而_un中保存的則是本地的數(shù)據(jù)

以u(píng)dp協(xié)議創(chuàng)建通信服務(wù)器,udp,服務(wù)器,網(wǎng)絡(luò)協(xié)議

udp協(xié)議為了本地通信與網(wǎng)絡(luò)通信同一套接口兼容,所以先將sockaddr_in/_un強(qiáng)轉(zhuǎn)成sockaddr類型傳入各個(gè)函數(shù),在函數(shù)中判斷前2個(gè)字節(jié)類型,來(lái)做本地通信或者網(wǎng)絡(luò)通信。

bind

以u(píng)dp協(xié)議創(chuàng)建通信服務(wù)器,udp,服務(wù)器,網(wǎng)絡(luò)協(xié)議

將套接字綁定,一般來(lái)說套接字綁定都是服務(wù)器才會(huì)綁定的,客戶端一般給操作系統(tǒng)自動(dòng)分配ip與端口的。

返回值:成功0,失敗-1.設(shè)置錯(cuò)誤碼

參數(shù):

  1. sockfd 需要綁定的套接字
  2. sockaddr包含了需要與套接字綁定的ip和端口號(hào)。
  3. addrlen該結(jié)構(gòu)體長(zhǎng)度。

recvfrom

用來(lái)接收數(shù)據(jù)的接收

以u(píng)dp協(xié)議創(chuàng)建通信服務(wù)器,udp,服務(wù)器,網(wǎng)絡(luò)協(xié)議

返回值:實(shí)際接收數(shù)據(jù)的長(zhǎng)度,-1失敗

參數(shù)

  1. sockfd:將從該套接字的端口和ip中取得數(shù)據(jù)
  2. buff:輸出型參數(shù),將數(shù)據(jù)存放到buff中。
  3. len:buff的長(zhǎng)度
  4. flags:以狀態(tài)等待數(shù)據(jù),一般填0,阻塞等待數(shù)據(jù)
  5. src_addr:發(fā)送方ip+port結(jié)構(gòu)體數(shù)據(jù),輸出型參數(shù)
  6. 結(jié)構(gòu)體數(shù)據(jù)長(zhǎng)度

sendto

發(fā)送數(shù)據(jù)給某個(gè)主機(jī)

以u(píng)dp協(xié)議創(chuàng)建通信服務(wù)器,udp,服務(wù)器,網(wǎng)絡(luò)協(xié)議

返回值:實(shí)際發(fā)送數(shù)據(jù)的個(gè)數(shù),-1失敗

參數(shù)

  1. sockfd:將發(fā)送方的ip+port發(fā)送給對(duì)方
  2. buff:輸入型參數(shù),將buff中數(shù)據(jù)發(fā)送給對(duì)方。
  3. len:buff的長(zhǎng)度;
  4. flags:默認(rèn)發(fā)送方式發(fā)送
  5. 接收方ip+port結(jié)構(gòu)體數(shù)據(jù),根據(jù)該參數(shù)尋找對(duì)于主機(jī)
  6. 結(jié)構(gòu)體數(shù)據(jù)長(zhǎng)度

sockaddr_in結(jié)構(gòu)體配套函數(shù)

以u(píng)dp協(xié)議創(chuàng)建通信服務(wù)器,udp,服務(wù)器,網(wǎng)絡(luò)協(xié)議

機(jī)器大小端的轉(zhuǎn)換函數(shù)。h本地to轉(zhuǎn)

以太網(wǎng)規(guī)定,網(wǎng)絡(luò)傳輸數(shù)據(jù)一定是大端方式傳輸,所以我們的機(jī)器無(wú)論是大端還是小端,在網(wǎng)絡(luò)中都會(huì)成為大端序列。

以u(píng)dp協(xié)議創(chuàng)建通信服務(wù)器,udp,服務(wù)器,網(wǎng)絡(luò)協(xié)議

?當(dāng)是為了人能看的明白,我們的ip地址一般都是以字符串的方式呈現(xiàn),這樣的方式我們稱為點(diǎn)分十進(jìn)制的方式。而且傳入為了的ip地址可能需要改序列,所以一批接口出現(xiàn)了。

以u(píng)dp協(xié)議創(chuàng)建通信服務(wù)器,udp,服務(wù)器,網(wǎng)絡(luò)協(xié)議

這些接口將字符串轉(zhuǎn)為uint32_t或者將uint32_t轉(zhuǎn)為字符串

代碼

一份2個(gè)主機(jī)通過服務(wù)器可以聊天的代碼

以u(píng)dp協(xié)議創(chuàng)建通信服務(wù)器,udp,服務(wù)器,網(wǎng)絡(luò)協(xié)議

服務(wù)器代碼:

server.hpp

#pragma once
#include <cstdio>
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "Log.hpp"
#include <unordered_map>
using std::cin;
using std::cout;
using std::endl;

class udp_server
{
    typedef int socket_t;
    void ip_type()
    {
        cout << "ip:" << _ip << endl;
        if (_ip == "127.0.0.1")
        {
            cout << "#####本地測(cè)試#####" << endl;
        }
        else if (_ip.empty())
        {
            cout << "#####開放全部ip地址#####" << endl;
        }
        else
        {
            cout << "#####指定ip地址#####" << endl;
        }
    }
    void init_server()
    {
        _socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if (_socket < 0)
        {
            Log(FATAL, "socket get fail!!![%d][%s]\n", __LINE__, __TIME__);
            exit(1);
        }
        struct sockaddr_in ip_port;
        bzero(&ip_port, sizeof(ip_port));
        ip_port.sin_family = AF_INET;
        ip_port.sin_addr.s_addr = _ip.empty() ? INADDR_ANY : inet_addr(_ip.c_str());
        ip_port.sin_port = htons(_port);
        if (bind(_socket, (struct sockaddr *)&ip_port, sizeof(ip_port)) < 0)
        {
            Log(FATAL, "bind  fail!!![%d][%s]\n", __LINE__, __TIME__);
            exit(2);
        }
        Log(NORMAL, "udp init success!!![%d][%s]\n", __LINE__, __TIME__);
    }

public:
    udp_server(uint16_t port, std::string ip = "") : _ip(ip), _port(port) {}
    udp_server() {}

    void activate()
    {
        init_server();
        ip_type();
        while (1)
        {
            char buff[1024] = {0};
            // cout<<"buff size: "<<strlen(buff)<<endl;
            struct sockaddr_in client_ip_port;
            socklen_t len = sizeof(client_ip_port);
            //開始等待客戶端

            ssize_t end = recvfrom(_socket, buff, sizeof(buff) - 1, 0, (struct sockaddr *)&client_ip_port, &len);
            char retbuff[1024]={0};
            // cout<<"buff size: "<<strlen(buff)<<endl;
            if (end >= 0)
            {
                buff[end] = '\0';
                printf("[%s:%d]clint say# %s\n", inet_ntoa(client_ip_port.sin_addr), ntohs(client_ip_port.sin_port), buff);
                sprintf(retbuff,"[%s:%d]clint say# %s", inet_ntoa(client_ip_port.sin_addr), ntohs(client_ip_port.sin_port), buff);
            }
            else
            {
                Log(WARINNG, "recvfrom Message have fail [%d][%s]\n", __LINE__, __TIME__);
            }
            //處理數(shù)據(jù)。
            char key[64];
            snprintf(key,sizeof(key),"%s-%u",inet_ntoa(client_ip_port.sin_addr),client_ip_port.sin_port);
            auto it = _users.find(key);
            if(it==_users.end())
            {
                cout<<key<<endl;
                cout<<key<<" :放入客戶端"<<endl;
                _users.insert({key,client_ip_port});
            }

            // cout<<"end : "<<end<<endl;
            //反饋
            for(auto&it:_users)
            {
                if(client_ip_port.sin_addr.s_addr==it.second.sin_addr.s_addr)
                {
                    continue;
                }
                sendto(_socket, retbuff, sizeof retbuff, 0, (struct sockaddr *)&(it.second), sizeof(it.second));
            }
            Log(Debug, "sendto Message have fail [%d][%s]\n", __LINE__, __TIME__);
        }
    }

private:
    socket_t _socket;
    std::string _ip;
    uint16_t _port;
    std::unordered_map<std::string, struct sockaddr_in> _users;
};

server.cpp

#include "server.hpp"
#include <memory>
using std::shared_ptr;
void SERVERUER()
{
    std::cout<<"./server + ip + port"<<std::endl;
}


int main(int argc,char*argv[])
{
    if(argc==2||argc==3)
    {
        cout<<"argc:"<<argc<<endl;
        if(argc==2)
        {
            in_port_t port=atoi(argv[1]);
            shared_ptr<udp_server> server_ptr(new udp_server(port));
            server_ptr->activate();
        }
        else
        {
            
            in_port_t port=atoi(argv[2]);
            std::string ip=argv[1];
            shared_ptr<udp_server> server_ptr(new udp_server(port,ip));
            server_ptr->activate();
        }
    }
    else
    {
        SERVERUER();
    }
    return 0;
}

客戶端代碼

client.cpp文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-688940.html

#include <cstdio>
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string>
#include <cstring>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "Log.hpp"
#include <pthread.h>
using std::cin;
using std::cout;
using std::endl;
typedef int socket_t;

void CLIENTUER()
{
    std::cout << "./client + ip + port" << std::endl;
}

void *thread_func(void *ages)
{
    socket_t *_socket = (socket_t*)ages;
    char get_messages[102];
    struct sockaddr_in temp;
    bzero((void *)&temp, sizeof(temp));
    socklen_t len(sizeof temp);
    while (1)
    {
        ssize_t end = recvfrom(*_socket, get_messages, sizeof(get_messages) - 1, 0, (struct sockaddr *)&temp, &len);
        if (end >= 0)
        {
            get_messages[end] = 0;
            std::cout<< get_messages << std::endl;
        }
    }
    return nullptr;
}

int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        CLIENTUER();
        exit(1);
    }
    socket_t _socket = socket(AF_INET, SOCK_DGRAM, 0);
    pthread_t tid;
    pthread_create(&tid,nullptr,thread_func,(void*)&_socket);
    std::string messages;
    struct sockaddr_in server_ip_port;
    bzero(&server_ip_port, sizeof(server_ip_port));
    server_ip_port.sin_family = AF_INET;
    server_ip_port.sin_addr.s_addr = inet_addr(argv[1]);
    server_ip_port.sin_port = htons(atoi(argv[2]));
    socklen_t len = sizeof(server_ip_port);

    while (1)
    {
        fflush(stdout);
        std::getline(std::cin, messages);
        sendto(_socket, messages.c_str(), messages.size(), 0, (struct sockaddr *)&server_ip_port, len);
    }
    return 0;
}

到了這里,關(guān)于以u(píng)dp協(xié)議創(chuàng)建通信服務(wù)器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • LoRaWAN網(wǎng)關(guān)與網(wǎng)絡(luò)服務(wù)器(NS)的通信CUPS 協(xié)議介紹

    LoRaWAN網(wǎng)關(guān)與網(wǎng)絡(luò)服務(wù)器(NS)的通信CUPS 協(xié)議介紹

    LoRa Basics? Station 定期查詢 CUPS 服務(wù)器以獲取更新。該協(xié)議是 HTTP/REST,使用Credentials中描述的客戶端/服務(wù)器身份驗(yàn)證方法。對(duì)于每個(gè)查詢,工作站都會(huì)提供有關(guān)其當(dāng)前狀態(tài)的信息,并接收包含其 LNS 和 CUPS 憑證更新的二進(jìn)制 blob,以及具有任意更新的通用數(shù)據(jù)段。 通用數(shù)據(jù)段

    2024年02月13日
    瀏覽(92)
  • 為什么說 QUIC 協(xié)議是現(xiàn)代化網(wǎng)絡(luò)通信的未來(lái)之路及如何實(shí)現(xiàn)QUIC服務(wù)器

    ??作者簡(jiǎn)介: 小曾同學(xué).com,一個(gè)致力于測(cè)試開發(fā)的博主??,主要職責(zé):測(cè)試開發(fā)、CI/CD 如果文章知識(shí)點(diǎn)有錯(cuò)誤的地方,還請(qǐng)大家指正,讓我們一起學(xué)習(xí),一起進(jìn)步。?? 座右銘:不想當(dāng)開發(fā)的測(cè)試,不是一個(gè)好測(cè)試??。 如果感覺博主的文章還不錯(cuò)的話,還請(qǐng)點(diǎn)贊、收藏哦

    2024年04月23日
    瀏覽(22)
  • UDP服務(wù)器—實(shí)現(xiàn)數(shù)據(jù)通信

    UDP服務(wù)器—實(shí)現(xiàn)數(shù)據(jù)通信

    目錄 前言 1.接口介紹 2.編寫服務(wù)器 3.編寫客戶端 4.測(cè)試 總結(jié) ? ? ? ? 在這篇文章中為大家介紹如何通過編碼實(shí)現(xiàn)數(shù)據(jù)通信,實(shí)現(xiàn)思路是根據(jù)前面介紹的網(wǎng)絡(luò)編程函數(shù)編寫一個(gè)服務(wù)端和客戶端,實(shí)現(xiàn)客戶端和服務(wù)端雙方通信 創(chuàng)建套接字 domain:網(wǎng)絡(luò)通信采用 AF_INET type:提供的

    2024年02月13日
    瀏覽(19)
  • 使用UDP協(xié)議實(shí)現(xiàn)—翻譯服務(wù)器

    使用UDP協(xié)議實(shí)現(xiàn)—翻譯服務(wù)器

    目錄 前言 1.設(shè)計(jì)思路: 2.詞庫(kù)設(shè)計(jì) 3.設(shè)計(jì)客戶端 4.設(shè)計(jì)服務(wù)端 5.編譯客戶端和服務(wù)端 6.測(cè)試結(jié)果 7.總結(jié) ? ? ? ? 上一篇文章中,我們使用UDP協(xié)議編碼完成了一個(gè)簡(jiǎn)單的服務(wù)器,實(shí)現(xiàn)數(shù)據(jù)通信,服務(wù)器設(shè)計(jì)出來(lái)后目的不僅僅只是實(shí)現(xiàn)數(shù)據(jù)通信,而是根據(jù)客戶端發(fā)過來(lái)的請(qǐng)求,

    2024年02月13日
    瀏覽(19)
  • 【Linux后端服務(wù)器開發(fā)】UDP協(xié)議

    【Linux后端服務(wù)器開發(fā)】UDP協(xié)議

    目錄 一、端口號(hào) 二、UDP報(bào)頭格式 三、UDP的特點(diǎn) 四、UDP協(xié)議實(shí)現(xiàn)網(wǎng)絡(luò)聊天群 端口號(hào)port標(biāo)識(shí)了一個(gè)主機(jī)上進(jìn)行通信的不同的應(yīng)用程序。 0 ~ 1023:系統(tǒng)端口號(hào),HTTP、FTP、SSH等這些廣為使用的應(yīng)用層協(xié)議,它們的端口號(hào)都是固定的系統(tǒng)端口號(hào)(知名端口號(hào)) 1024 ~ 65535:操作系統(tǒng)

    2024年02月16日
    瀏覽(20)
  • UDP服務(wù)器和客戶端的創(chuàng)建步驟

    一、創(chuàng)建用戶數(shù)據(jù)報(bào)套接字(socket函數(shù)): 通信域選擇 IPV4網(wǎng)絡(luò)協(xié)議 、套接字類型選擇 數(shù)據(jù)報(bào)式 ; 二、填充服務(wù)器的網(wǎng)絡(luò)信息結(jié)構(gòu)體: 1.定義網(wǎng)絡(luò)信息結(jié)構(gòu)體變量; 2.求出結(jié)構(gòu)體變量的內(nèi)存空間大??; 3.結(jié)構(gòu)體清零; 4.使用IPV4網(wǎng)絡(luò)協(xié)議; 5.預(yù)留給在終端輸入的網(wǎng)絡(luò)字節(jié)序

    2024年01月19日
    瀏覽(14)
  • Unity-UDP-客戶端/服務(wù)器通信功能

    Unity-UDP-客戶端/服務(wù)器通信功能

    這里簡(jiǎn)單實(shí)現(xiàn)客戶端和服務(wù)器,復(fù)雜的實(shí)現(xiàn)需要和前幾篇文章的TCP一樣,管理多個(gè)鏈接過來(lái)的客戶端,這里只有一個(gè)。需要自己封裝類似listener來(lái)管理多個(gè)鏈接過來(lái)的設(shè)備,每次都緩存ReceiveAsync收到消息的中的RemoteEndPoint地址端口,統(tǒng)一管理發(fā)送接收消息。 https://zhidao.baidu.c

    2024年02月11日
    瀏覽(34)
  • 【網(wǎng)絡(luò)】UDP網(wǎng)絡(luò)服務(wù)器

    【網(wǎng)絡(luò)】UDP網(wǎng)絡(luò)服務(wù)器

    代碼的整體邏輯: UDP服務(wù)端 :udpServer.cc(服務(wù)端的調(diào)用),udpServer.hpp(服務(wù)端的實(shí)現(xiàn)) UDP客戶端 :udpClient.cc(客戶端的調(diào)用),udpClient.hpp(客戶端的實(shí)現(xiàn)) 服務(wù)端:1.初始化服務(wù)器 2.啟動(dòng)服務(wù)器? 作為一款服務(wù)器:要有自己的服務(wù)端口號(hào)uint16_t?_port,同時(shí)網(wǎng)絡(luò)服務(wù)器需要有對(duì)應(yīng)

    2024年02月08日
    瀏覽(48)
  • 【網(wǎng)絡(luò)】UDP網(wǎng)絡(luò)服務(wù)器簡(jiǎn)單模擬實(shí)現(xiàn)

    【網(wǎng)絡(luò)】UDP網(wǎng)絡(luò)服務(wù)器簡(jiǎn)單模擬實(shí)現(xiàn)

    【網(wǎng)絡(luò)】UDP網(wǎng)絡(luò)服務(wù)器簡(jiǎn)單模擬實(shí)現(xiàn) UDP的封裝 : UDP網(wǎng)絡(luò)服務(wù)器模擬實(shí)現(xiàn):主要分為makefile文件進(jìn)行編譯 UDP客戶端 :udpClient.cc(客戶端的調(diào)用),udpClient.hpp(客戶端的實(shí)現(xiàn)) UDP服務(wù)端 :udpServer.cc(服務(wù)端的調(diào)用),udpServer.hpp(服務(wù)端的實(shí)現(xiàn)) 創(chuàng)建makefile文件: makefile里可以定義變

    2024年02月08日
    瀏覽(31)
  • 集群服務(wù)器通信協(xié)議:TIPC簡(jiǎn)介

    1.TIPC協(xié)議簡(jiǎn)介 ?? TIPC是愛立信公司提出的一種透明進(jìn)程間通信協(xié)議(Transparent Interprocess Communication), 主要適用于高可用(HAL)和動(dòng)態(tài)集群環(huán)境. 該軟件當(dāng)前主要由風(fēng)河(windriver)公司在維護(hù), 主要支持Linux, Solaris 和 VxWorks三種操作系統(tǒng), 從Linux內(nèi)核2.6.34開始支持TIPC的最新版本2.0, 不過還

    2024年02月08日
    瀏覽(13)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包