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

【Linux Network】網(wǎng)絡(luò)編程套接字(代碼練習(xí))—UDP

這篇具有很好參考價(jià)值的文章主要介紹了【Linux Network】網(wǎng)絡(luò)編程套接字(代碼練習(xí))—UDP。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

1. 常用接口

2. C/S 回聲模擬

3. C/S myshell 的制作



【Linux Network】網(wǎng)絡(luò)編程套接字(代碼練習(xí))—UDP

?Linux網(wǎng)絡(luò)編程?

1. 常用接口

socket:創(chuàng)建套接字:

// 創(chuàng)建 socket 文件描述符
int socket(int domain, int type, int protocol);

返回值:

  • 套接字創(chuàng)建成功返回一個(gè)文件描述符 ,創(chuàng)建失敗返回-1,同時(shí)錯(cuò)誤碼會(huì)被設(shè)置。

參數(shù):

  • domain:網(wǎng)絡(luò)通信設(shè)置為AF_INET(IPv4)或AF_INET6(IPv6);
  • type:基于UDP的網(wǎng)絡(luò)通信,我們采用的就是SOCK_DGRAM,叫做用戶(hù)數(shù)據(jù)報(bào)服務(wù);
  • protocol:創(chuàng)建套接字的協(xié)議類(lèi)別,一般設(shè)置為0;

?struct sockaddr_in 結(jié)構(gòu)體:

struct sockaddr_in當(dāng)中的成員如下:

sin_family:表示通信機(jī)制(本地/網(wǎng)絡(luò))。
sin_port:表示端口號(hào),是一個(gè)16位的整數(shù)。
sin_addr.s_addr:表示IP地址,是一個(gè)32位的整數(shù)。

bind:綁定端口號(hào):

// 綁定端口號(hào) (TCP/UDP, 服務(wù)器) 
int bind(int socket, const struct sockaddr *address, socklen_t address_len);

返回值:

  • 綁定成功返回0,綁定失敗返回-1,同時(shí)錯(cuò)誤碼會(huì)被設(shè)置。

參數(shù):

  • socket:綁定的文件的文件描述符。也就是我們創(chuàng)建套接字時(shí)獲取到的文件描述符。
  • addr:網(wǎng)絡(luò)相關(guān)的屬性信息,包括協(xié)議家族、IP地址、端口號(hào)等。
  • addrlen:傳入的addr結(jié)構(gòu)體的長(zhǎng)度。

讀取數(shù)據(jù):recvfrom函數(shù)

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

返回值:

  • 讀取成功返回實(shí)際讀取到的字節(jié)數(shù),讀取失敗返回-1,同時(shí)錯(cuò)誤碼會(huì)被設(shè)置。

參數(shù):

  • sockfd:對(duì)應(yīng)操作的文件描述符。表示從該文件描述符索引的文件當(dāng)中讀取數(shù)據(jù)。
  • buf:讀取數(shù)據(jù)的存放位置。
  • len:期望讀取數(shù)據(jù)的字節(jié)數(shù)。
  • flags:讀取的方式。一般設(shè)置為0,表示阻塞讀取。
  • src_addr:對(duì)端網(wǎng)絡(luò)相關(guān)的屬性信息,包括協(xié)議家族、IP地址、端口號(hào)等。
  • addrlen:調(diào)用時(shí)傳入期望讀取的src_addr結(jié)構(gòu)體的長(zhǎng)度,返回時(shí)代表實(shí)際讀取到的src_addr結(jié)構(gòu)體的長(zhǎng)度,這是一個(gè)輸入輸出型參數(shù)。

注意:

  • 由于recvfrom函數(shù)提供的參數(shù)也是struct sockaddr類(lèi)型的,因此我們?cè)趥魅虢Y(jié)構(gòu)體地址時(shí)需要將struct sockaddr_in類(lèi)型進(jìn)行強(qiáng)轉(zhuǎn)。

發(fā)送數(shù)據(jù):sendto函數(shù)

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

返回值:

  • 寫(xiě)入成功返回實(shí)際寫(xiě)入的字節(jié)數(shù),寫(xiě)入失敗返回-1,同時(shí)錯(cuò)誤碼會(huì)被設(shè)置。

參數(shù):

  • sockfd:對(duì)應(yīng)操作的文件描述符。表示將數(shù)據(jù)寫(xiě)入該文件描述符索引的文件當(dāng)中。
  • buf:待寫(xiě)入數(shù)據(jù)的存放位置。
  • len:期望寫(xiě)入數(shù)據(jù)的字節(jié)數(shù)。
  • flags:寫(xiě)入的方式。一般設(shè)置為0,表示阻塞寫(xiě)入。
  • dest_addr:對(duì)端網(wǎng)絡(luò)相關(guān)的屬性信息,包括協(xié)議家族、IP地址、端口號(hào)等。 addrlen:傳入dest_addr結(jié)構(gòu)體的長(zhǎng)度。

2. C/S 回聲模擬

結(jié)果演示:

【Linux Network】網(wǎng)絡(luò)編程套接字(代碼練習(xí))—UDP

源代碼:

  • makefile
.PHONY:all
all:udp_server udp_client 

udp_server:udp_server.cc
	g++ -o $@ $^ -std=c++11
udp_client:udp_client.cc 
	g++ -o $@ $^ -std=c++11 -static 

.PHONY:clean
clean:
	rm -f udp_server udp_client
  • udp_server.cc
#include <iostream>
#include <string>
#include <cerrno>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

using namespace std;

int main()
{
    //1.創(chuàng)建套接字
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    if(sock < 0)
    {
        cout << "socket failed:" << errno << endl;
        return 1;
    }
    //2.定義結(jié)構(gòu)體
    struct sockaddr_in local;
    local.sin_family = AF_INET;
    local.sin_port = htons(uint16_t(8080));
    local.sin_addr.s_addr = INADDR_ANY;
    //3.綁定端口號(hào)
    if(bind(sock, (struct sockaddr*)&local, sizeof(local)) <0 )
    {
        cout<< "bind failed:" << errno << endl;
        return 2;
    }
    //4.通信
    while(true)
    {
        char buffer[1024];
        struct sockaddr_in peer;
        socklen_t len = sizeof(peer);
        recvfrom(sock, buffer, sizeof(buffer), 0, (struct sockaddr*)&peer, &len);
        cout<< "client say # "<< buffer <<endl;
        string message = "hello client";
        sendto(sock, message.c_str(), message.size(), 0, (struct sockaddr*)&peer, len);

    }
    return 0;
}
  • udp_client.cc
#include <iostream>
#include <string>
#include <cerrno>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

using namespace std;

//使用手冊(cè)
void Usage(char* proc)
{
    cout << "Usage:\n\t" << proc <<" server_ip server_port"<<endl;
}

int main(int argc, char* argv[])
{
    if(argc!=3)
    {
        Usage(argv[0]);
        return 1;
    }
    //1.創(chuàng)建套接字
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    if(sock < 0)
    {
        cout << "socket failed:" << errno <<endl;
        return 2;
    }
    //2.定義結(jié)構(gòu)體
    struct sockaddr_in server;
    socklen_t len = sizeof(server);
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr(argv[1]);
    server.sin_port = htons(atoi(argv[2]));
    //客戶(hù)端不用顯示綁定
    //3.通信
    while(true)
    {
        string message;
        char buffer[1024];
        cout << "請(qǐng)輸入:";
        cin >> message;
        sendto(sock, message.c_str(), message.size(), 0, (struct sockaddr*)&server, len);
        recvfrom(sock, buffer, sizeof(buffer), 0, (struct sockaddr*)&server, &len);
        cout << "server say # " << buffer<<endl;
    }
    return 0;
}

3. C/S myshell 的制作

結(jié)果演示:

【Linux Network】網(wǎng)絡(luò)編程套接字(代碼練習(xí))—UDP

源代碼:?

  • makefile
.PHONY:all
all:udp_server udp_client

udp_server:udp_server.cc
	g++ -o $@ $^ -std=c++11
udp_client:udp_client.cc 
	g++ -o $@ $^ -std=c++11

.PHONY:clean
clean:
	rm -f udp_server udp_client
  • udp_server.cc
#include <iostream>
#include <string>
#include <cerrno>
#include <cstring>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>

using namespace std;

//使用手冊(cè)
void Usage(char* proc)
{
    cout<<"Usage:\n\t"<<proc<<" server_port"<<endl;
}

int main(int argc, char* argv[])
{
    if(argc!=2)
    {
        Usage(argv[0]);
        return 1;
    }
    //1.創(chuàng)建套接字
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    if(sock<0)
    {
        cout<<"socket failed!"<<errno<<endl;
        return 2;
    }
    //2.定義結(jié)構(gòu)體
    struct sockaddr_in local;
    local.sin_family = AF_INET;
    local.sin_addr.s_addr = INADDR_ANY;
    local.sin_port = htons(atoi(argv[1]));
    //3.綁定
    if(bind(sock, (struct sockaddr*)&local, sizeof(local))<0)
    {
        cout << "bind failed!"<<errno<<endl;
        return 3;
    }
    //4.業(yè)務(wù)邏輯
    while(true)
    {
        char buffer[1024]={0};
        struct sockaddr_in peer;
        socklen_t len = sizeof(peer);
        ssize_t s = recvfrom(sock, buffer, sizeof(buffer), 0, (struct sockaddr*)&peer, &len);
        if(s>0)
        {
            buffer[s]=0;
            cout<<"client say # " << buffer;
            //popen函數(shù):執(zhí)行buffer里的命令,將執(zhí)行結(jié)果以文件方式返回
            FILE* fd = popen(buffer, "r");
            char line[1024];
            string message;
            while(fgets(line, sizeof(line),fd)!=NULL)
            {
                message += line;
            }
            sendto(sock, message.c_str(), message.size(), 0, (struct sockaddr*)&peer, len);
        }
    }
    return 0;
}
  • udp_client.cc
#include <iostream>
#include <string>
#include <cerrno>
#include <cstring>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>

using namespace std;

//使用手冊(cè)
void Usage(char* proc)
{
    cout << "Usage:\n\t"<<proc<<" server_ip server_port"<<endl;
}

int main(int argc, char* argv[])
{
    if(argc!=3)
    {
        Usage(argv[0]);
        return 1;
    }
    //1.創(chuàng)建套接字
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    if(sock<0)
    {
        cout << "socket failed:" <<errno<<endl;
        return 2;
    }
    //2.定義結(jié)構(gòu)體
    struct sockaddr_in server;
    socklen_t len = sizeof(server);
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr(argv[1]);
    server.sin_port = htons(atoi(argv[2]));
    //客戶(hù)端不用顯示綁定
    //3.業(yè)務(wù)邏輯
    while(true)
    {
        cout<<"My shell # ";
        char buffer[1024]={0};
        fgets(buffer, sizeof(buffer), stdin);

        sendto(sock, buffer, sizeof(buffer), 0, (struct sockaddr*)&server, len);
        ssize_t s = recvfrom(sock, buffer, sizeof(buffer), 0, (struct sockaddr*)&server, &len);
        if(s>0)
        {
            buffer[s]=0;
            cout<<buffer<<endl;
        }
    }
    return 0;
}

如果上述文章對(duì)您有所幫助的話(huà),還請(qǐng)點(diǎn)贊??,收藏??,關(guān)注??文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-437904.html

到了這里,關(guān)于【Linux Network】網(wǎng)絡(luò)編程套接字(代碼練習(xí))—UDP的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(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)文章

  • Linux網(wǎng)絡(luò)編程(二-套接字)

    Linux網(wǎng)絡(luò)編程(二-套接字)

    目錄 一、背景知識(shí) 1.1 端口號(hào) 1.2 網(wǎng)絡(luò)字節(jié)序 1.3 地址轉(zhuǎn)換函數(shù)? 二、Socket簡(jiǎn)介 三、套接字相關(guān)的函數(shù)? 3.1 socket() 3.2 bind() 3.3 connect() 3.4 listen() 3.5 accept()? 3.6 read()/recv()/recvfrom() 3.7 send()/sendto() ?3.8 close() ?四、UPD客服/服務(wù)端實(shí)驗(yàn)? 1.1 端口號(hào) 端口號(hào)是訪(fǎng)問(wèn)服務(wù)器的標(biāo)識(shí) ,就好像

    2024年01月22日
    瀏覽(166)
  • 【Linux】網(wǎng)絡(luò)編程套接字一

    【Linux】網(wǎng)絡(luò)編程套接字一

    上篇博客由唐僧的例子我們知道: 在IP數(shù)據(jù)包頭部中,有兩個(gè)IP地址,分別叫做源IP地址,和目的IP地址。 思考一下: 不考慮中間的一系列步驟,兩臺(tái)主機(jī)我們光有IP地址就可以完成通信了嘛? 想象一下發(fā)qq消息的例子,有了IP地址能夠把消息發(fā)送到對(duì)方的機(jī)器上。 但是我們把

    2024年03月26日
    瀏覽(1081)
  • linux【網(wǎng)絡(luò)編程】之網(wǎng)絡(luò)套接字預(yù)備

    linux【網(wǎng)絡(luò)編程】之網(wǎng)絡(luò)套接字預(yù)備

    在【網(wǎng)絡(luò)基礎(chǔ)】中我們提到了IP地址,接下來(lái)了解一下網(wǎng)絡(luò)通信中其他方面的知識(shí) 端口號(hào)是一個(gè)2字節(jié)16位的整數(shù); 端口號(hào)用來(lái)標(biāo)識(shí)一個(gè)進(jìn)程, 告訴操作系統(tǒng), 當(dāng)前的這個(gè)數(shù)據(jù)要交給哪一個(gè)進(jìn)程來(lái)處理; 一個(gè)端口號(hào)只能被一個(gè)進(jìn)程占用 通信原理 (公網(wǎng))IP唯一標(biāo)識(shí)一臺(tái)主機(jī),這樣兩臺(tái)

    2024年02月05日
    瀏覽(298)
  • 【Linux網(wǎng)絡(luò)】網(wǎng)絡(luò)編程套接字(TCP)

    【Linux網(wǎng)絡(luò)】網(wǎng)絡(luò)編程套接字(TCP)

    目錄 地址轉(zhuǎn)換函數(shù) 字符串IP轉(zhuǎn)整數(shù)IP 整數(shù)IP轉(zhuǎn)字符串IP 關(guān)于inet_ntoa 簡(jiǎn)單的單執(zhí)行流TCP網(wǎng)絡(luò)程序 TCP socket API 詳解及封裝TCP socket? 服務(wù)端創(chuàng)建套接字? 服務(wù)端綁定? 服務(wù)端監(jiān)聽(tīng)? 服務(wù)端獲取連接? 服務(wù)端處理請(qǐng)求 客戶(hù)端創(chuàng)建套接字 客戶(hù)端連接服務(wù)器 客戶(hù)端發(fā)起請(qǐng)求 服務(wù)器測(cè)試

    2024年03月21日
    瀏覽(113)
  • 【Linux】網(wǎng)絡(luò)---->套接字編程(TCP)

    【Linux】網(wǎng)絡(luò)---->套接字編程(TCP)

    TCP的編程流程:大致可以分為五個(gè)過(guò)程,分別是準(zhǔn)備過(guò)程、連接建立過(guò)程、獲取新連接過(guò)程、消息收發(fā)過(guò)程和斷開(kāi)過(guò)程。 1.準(zhǔn)備過(guò)程:服務(wù)端和客戶(hù)端需要?jiǎng)?chuàng)建各自的套接字,除此之外服務(wù)端還需要綁定自己的地址信息和進(jìn)行監(jiān)聽(tīng)。注意:服務(wù)端調(diào)用listen函數(shù)后,處理監(jiān)聽(tīng)狀

    2024年02月04日
    瀏覽(101)
  • Linux網(wǎng)絡(luò)編程——tcp套接字

    Linux網(wǎng)絡(luò)編程——tcp套接字

    本章Gitee倉(cāng)庫(kù):tcp套接字 客戶(hù)端: 客戶(hù)端: 關(guān)于構(gòu)造和初始化,可以直接在構(gòu)造的時(shí)候,將服務(wù)器初始化,那為什么還要寫(xiě)到 init 初始化函數(shù)里面呢? 構(gòu)造盡量簡(jiǎn)單一點(diǎn),不要做一些“有風(fēng)險(xiǎn)”的操作。 tcp 是面向連接的,通信之前要建立連接,服務(wù)器處于等待連接到來(lái)的

    2024年02月20日
    瀏覽(96)
  • 【Linux】網(wǎng)絡(luò)基礎(chǔ)+UDP網(wǎng)絡(luò)套接字編程

    【Linux】網(wǎng)絡(luò)基礎(chǔ)+UDP網(wǎng)絡(luò)套接字編程

    只做自己喜歡做的事情,不被社會(huì)和時(shí)代裹挾著前進(jìn),是一件很奢侈的事。 1. 首先計(jì)算機(jī)是人類(lèi)設(shè)計(jì)出來(lái)提高生產(chǎn)力的工具,而人類(lèi)的文明綿延至今一定離不開(kāi)人類(lèi)之間互相的協(xié)作,既然人類(lèi)需要協(xié)作以完成更為復(fù)雜的工作和難題,所以計(jì)算機(jī)作為人類(lèi)的工具自然也一定需要

    2024年02月08日
    瀏覽(89)
  • 【Linux網(wǎng)絡(luò)編程】網(wǎng)絡(luò)編程套接字(TCP服務(wù)器)

    【Linux網(wǎng)絡(luò)編程】網(wǎng)絡(luò)編程套接字(TCP服務(wù)器)

    作者:愛(ài)寫(xiě)代碼的剛子 時(shí)間:2024.4.4 前言:本篇博客主要介紹TCP及其服務(wù)器編碼 只介紹基于IPv4的socket網(wǎng)絡(luò)編程,sockaddr_in中的成員struct in_addr sin_addr表示32位 的IP地址 但是我們通常用點(diǎn)分十進(jìn)制的字符串表示IP地址,以下函數(shù)可以在字符串表示和in_addr表示之間轉(zhuǎn)換 字符串轉(zhuǎn)in

    2024年04月14日
    瀏覽(108)
  • 【Linux網(wǎng)絡(luò)】網(wǎng)絡(luò)編程套接字(預(yù)備知識(shí)+UDP)

    【Linux網(wǎng)絡(luò)】網(wǎng)絡(luò)編程套接字(預(yù)備知識(shí)+UDP)

    目錄 預(yù)備知識(shí) 1. 理解源IP地址和目的IP地址 2. 理解源MAC地址和目的MAC地址 3. 認(rèn)識(shí)端口號(hào) ?4. 理解源端口號(hào)和目的端口號(hào) 5. 端口號(hào)(port) vs 進(jìn)程pid 6. 認(rèn)識(shí)TCP協(xié)議和認(rèn)識(shí)UDP協(xié)議 7. 網(wǎng)絡(luò)字節(jié)序 socket編程接口? 1. socket 常見(jiàn)API 2. sockaddr結(jié)構(gòu)? 簡(jiǎn)單的UDP網(wǎng)絡(luò)程序? 1. 服務(wù)端創(chuàng)建udp

    2024年02月19日
    瀏覽(93)
  • Linux網(wǎng)絡(luò)編程- 原始套接字(Raw Socket)

    原始套接字(Raw Socket)提供了一種機(jī)制,允許應(yīng)用程序直接訪(fǎng)問(wèn)底層傳輸協(xié)議,繞過(guò)操作系統(tǒng)提供的傳輸層接口。這種套接字通常用于實(shí)現(xiàn)新的協(xié)議或?qū)ΜF(xiàn)有協(xié)議進(jìn)行低級(jí)別的操作。 以下是對(duì)原始套接字的詳細(xì)介紹: 定義與用途 : 原始套接字是直接基于網(wǎng)絡(luò)層(如IP)的。

    2024年02月07日
    瀏覽(97)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包