7.UDP網(wǎng)絡(luò)通信

1. 流程

服務(wù)器:
    創(chuàng)建套接字 socket( )
    填充服務(wù)器網(wǎng)絡(luò)信息結(jié)構(gòu)體 sockaddr_in
    將套接字與服務(wù)器網(wǎng)絡(luò)信息結(jié)構(gòu)體綁定 bind( )
    進(jìn)行通信 recvfrom( )/sendto( )
客戶端:
    創(chuàng)建套接字 socket( )
    填充服務(wù)器網(wǎng)絡(luò)信息結(jié)構(gòu)體 sockaddr_in
    進(jìn)行通信 sendto( )/recvfrom( )

2. sendto

#include <sys/socket.h>

ssize_t sendto(int socket, const void *message, size_t length,
       int flags, const struct sockaddr *dest_addr, socklen_t dest_len);
功能:發(fā)送數(shù)據(jù)
參數(shù):
    socket:文件描述符
    message:發(fā)送的數(shù)據(jù)
    length:數(shù)據(jù)的長(zhǎng)度
    flags:標(biāo)志位国拇,一般為0
    dest_addr:目的地址(發(fā)送給誰)
    dest_len:addr的大小
返回值:
    成功:發(fā)送數(shù)據(jù)的長(zhǎng)度
    失斅冈獭:-1

3.recvfrom

#include <sys/types.h>
#include <sys/socket.h>

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
        struct sockaddr *src_addr, socklen_t *addrlen);
功能:接收數(shù)據(jù)
參數(shù):
    sockfd:文件描述符
    buf:接收的數(shù)據(jù)
    len:部分的長(zhǎng)度
    flags:標(biāo)志位,一般為0
    src_addr:源的地址(接收誰的數(shù)據(jù)溅蛉,自動(dòng)填充)
    addrlen:addr的大小
返回值:
    成功:接收的數(shù)據(jù)的長(zhǎng)度
    失敗:-1

服務(wù)器端

#include <stdio.h> //printf
#include <arpa/inet.h> //inet_addr htons
#include <sys/types.h>
#include <sys/socket.h> //scoket bind listen accept connect
#include <netinet/in.h> //sockaddr_in
#include <stdlib.h> //exit
#include <unistd.h> //close
#include <string.h> //strcat
#include <strings.h>

#define N 128
#define errlog(errmsg) do{perror(errmsg);\
                          printf("%s-->%s-->%d\n", __FILE__, __func__, __LINE__);\
                          exit(1);\
                         }while(0)

int main(int argc, const char *argv[])
{
    int sockfd;
    struct sockaddr_in serveraddr, clientaddr;
    socklen_t addrlen = sizeof(serveraddr);
    char buf[N] = {};

    //初始化結(jié)構(gòu)體
    //bzero memset
    bzero(&serveraddr, addrlen);
    bzero(&clientaddr, addrlen);

    if(argc < 3)
    {
        printf("the argument is too less\n");
        exit(1);
    }

    //第一步:創(chuàng)建套接字
    if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        errlog("fail to socket");
    }

    //第二步:填充服務(wù)器網(wǎng)絡(luò)信息結(jié)構(gòu)體
    //inet_addr:將點(diǎn)分十進(jìn)制IP地址轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)序的整型數(shù)據(jù)
    //htons:將主機(jī)字節(jié)序轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)序
    //atoi:將數(shù)字型字符串轉(zhuǎn)化為整型數(shù)據(jù)
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
    serveraddr.sin_port = htons(atoi(argv[2]));

    //第三步:將套接字域網(wǎng)絡(luò)信息結(jié)構(gòu)體綁定
    if(bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
    {
        errlog("fail to bind");
    }

    ssize_t ret;
    while(1)
    {
        if((ret = recvfrom(sockfd, buf, N, 0, (struct sockaddr *)&clientaddr, &addrlen)) < 0)
        {
            errlog("fail to recvfrom");
        }
        else
        {
            if(strncmp(buf, "quit", 4) == 0)
            {
                break;
            }
            else
            {
                printf("%s --> %d\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
                printf("client:%s\n", buf);

                strcat(buf, " *_*");

                if(sendto(sockfd, buf, N, 0, (struct sockaddr *)&clientaddr, addrlen) < 0)
                {
                    errlog("fail to sendto");
                }
            }
        }
    }

    close(sockfd);
    
    return 0;
}

客戶端

#include <stdio.h> //printf
#include <arpa/inet.h> //inet_addr htons
#include <sys/types.h>
#include <sys/socket.h> //scoket bind listen accept connect
#include <netinet/in.h> //sockaddr_in
#include <stdlib.h> //exit
#include <unistd.h> //close
#include <string.h> 

#define N 128
#define errlog(errmsg) do{perror(errmsg);\
                          printf("%s-->%s-->%d\n", __FILE__, __func__, __LINE__);\
                          exit(1);\
                         }while(0)

int main(int argc, const char *argv[])
{
    int sockfd;
    struct sockaddr_in serveraddr, clientaddr;
    socklen_t addrlen = sizeof(serveraddr);
    char buf[N] = {};

    if(argc < 3)
    {
        printf("the argument is too less\n");
        exit(1);
    }

    //第一步:創(chuàng)建套接字
    if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        errlog("fail to socket");
    }

    //第二步:填充服務(wù)器網(wǎng)絡(luò)信息結(jié)構(gòu)體
    //inet_addr:將點(diǎn)分十進(jìn)制IP地址轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)序的整型數(shù)據(jù)
    //htons:將主機(jī)字節(jié)序轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)序
    //atoi:將數(shù)字型字符串轉(zhuǎn)化為整型數(shù)據(jù)
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
    serveraddr.sin_port = htons(atoi(argv[2]));

    while(1)
    {
        fgets(buf, N, stdin);
        buf[strlen(buf) - 1] = '\0';

        if(sendto(sockfd, buf, N, 0, (struct sockaddr *)&serveraddr, addrlen) < 0)
        {
            errlog("fail to sendto");
        }

        if(strncmp(buf, "quit", 4) == 0)
        {
            break;
        }
        else
        {
            if(recvfrom(sockfd, buf, N, 0, NULL, NULL) < 0)
            {
                errlog("fail to recvfrom");
            }

            printf("server:%s\n", buf);
        }
    }

    close(sockfd);

    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末橘券,一起剝皮案震驚了整個(gè)濱河市党远,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌营勤,老刑警劉巖灵嫌,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異葛作,居然都是意外死亡寿羞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門赂蠢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绪穆,“玉大人,你說我怎么就攤上這事虱岂【猎海” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵第岖,是天一觀的道長(zhǎng)难菌。 經(jīng)常有香客問我,道長(zhǎng)蔑滓,這世上最難降的妖魔是什么郊酒? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮键袱,結(jié)果婚禮上燎窘,老公的妹妹穿的比我還像新娘。我一直安慰自己杠纵,他們只是感情好荠耽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著比藻,像睡著了一般铝量。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上银亲,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天慢叨,我揣著相機(jī)與錄音,去河邊找鬼务蝠。 笑死拍谐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播轩拨,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼践瓷,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了亡蓉?” 一聲冷哼從身側(cè)響起晕翠,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砍濒,沒想到半個(gè)月后淋肾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爸邢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年樊卓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杠河。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碌尔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出券敌,到底是詐尸還是另有隱情七扰,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布陪白,位于F島的核電站颈走,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咱士。R本人自食惡果不足惜立由,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望序厉。 院中可真熱鬧锐膜,春花似錦、人聲如沸弛房。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽文捶。三九已至荷逞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粹排,已是汗流浹背种远。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留顽耳,地道東北人坠敷。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓妙同,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親膝迎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子粥帚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)限次,斷路器茎辐,智...
    卡卡羅2017閱讀 134,665評(píng)論 18 139
  • UDP C/S的典型函數(shù)調(diào)用 UDP沒有像TCP那樣的連接,客戶端直接sendto向某服務(wù)器發(fā)送數(shù)據(jù)掂恕,服務(wù)器端一直...
    opas閱讀 1,184評(píng)論 0 0
  • 原文地址 http://blog.csdn.net/u012409247/article/details/4985...
    0fbf551ff6fb閱讀 3,522評(píng)論 0 13
  • 1. 網(wǎng)絡(luò)基礎(chǔ)TCP/IP HTTP基于TCP/IP協(xié)議族,HTTP屬于它內(nèi)部的一個(gè)子集弛槐。 把互聯(lián)網(wǎng)相關(guān)聯(lián)的協(xié)議集...
    yozosann閱讀 3,444評(píng)論 0 20
  • 一個(gè)女人變化最大的不是結(jié)婚懊亡,而是有了孩子。 不僅僅是有了孩子乎串,是親自去帶店枣,從早到晚,帶孩子不光是白天的陪她叹誉,還有晚...
    長(zhǎng)弓心悅閱讀 176評(píng)論 0 1