linux udp網(wǎng)絡(luò)通信

  • recvform函數(shù)
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *from, int *fromlen);
返回:大于0-成功接收數(shù)據(jù)長度连茧;-1-出錯;
UDP套接字使用無連接協(xié)議,因此必須使用recvfrom函數(shù),指明源地址;本函數(shù)從(已連接)套接口上接收數(shù)據(jù)罐韩,并捕獲數(shù)據(jù)發(fā)送源的地址。
flags是傳輸控制標(biāo)志,其值定義如下:
0:常規(guī)操作绞绒,如同read()函數(shù);
from 和 fromlen 是“數(shù)據(jù)源地址-長度”參數(shù)榕暇。
  • sendto函數(shù)
#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *msg, size_t len, int flags, const struct sockaddr *to, int tolen);
        返回:大于0-成功發(fā)送數(shù)據(jù)長度蓬衡;-1-出錯;
UDP套接字使用無連接協(xié)議彤枢,因此必須使用sendto函數(shù)狰晚,指明目的地址;
flags是傳輸控制標(biāo)志缴啡,其值定義如下:
0:常規(guī)操作壁晒,如同write()函數(shù);

代碼實戰(zhàn)

/*udpclient.c*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include<stdlib.h>
#include<errno.h>
int main(int argc, char *argv[]) 
{   
    int fd; 
    struct sockaddr_in server,peer; 
    char rbuf[100]; 
    socklen_t len;
    int num;

    if (argc !=3) 
    { 
        printf("Usage: %s <IP Address> <message>\n", argv[0]); 
        exit(1); 
    } 
    fd=socket(AF_INET, SOCK_DGRAM, 0);
    if (fd==-1)
    { 
        perror("socket"); 
        exit(1);   
    } 
    bzero(&server,sizeof(server));
    server.sin_family = AF_INET; 
    server.sin_port = htons(1234);  
    server.sin_addr.s_addr = inet_addr(argv[1]); 
        
    //發(fā)送數(shù)據(jù)
    num=sendto(fd,argv[2],strlen(argv[2]),0,(struct sockaddr *)&server,sizeof(server));
    printf("client send %d bytes\n",num);
    len=sizeof(server);
    while(1)
    {
        //if(strncmp(argv[2],"bye",3)==0)
        //  break;
        //接收數(shù)據(jù)
        num=recvfrom(fd,rbuf,sizeof(rbuf),0,(struct sockaddr *)&peer,&len);
        if(num==-1) 
        {  
            printf("recvfrom errno is %d\n",errno);  
            break;  
        }
        rbuf[num]='\0';
        //比較是否是服務(wù)器地址
        // memcmp是比較內(nèi)存區(qū)域buf1和buf2的前count個字節(jié)业栅。該函數(shù)是按字節(jié)比較的秒咐。
        if(len != sizeof(server)  || memcmp(&server,&peer,len)!=0)
        {   
            printf("message not from server!\n");    
            continue;    
        }

        //輸出信息
        printf("server message:%s.\n",rbuf);
        break;
    }
    close(fd);
}
/*udpserver.c*/
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include<stdlib.h>
int main(void)
{
    int sockfd;
    struct sockaddr_in  server,client;
    int port = 1234;
    int opt = SO_REUSEADDR;
    int rt;
    int addrlen;
    char sendbuf[100];
    char rbuf[100];
    int num;

    sockfd=socket(AF_INET,SOCK_DGRAM,0);
    if(sockfd==-1)
    {
        perror("socket");
        exit(1);
    }
    
    //避免出現(xiàn)地址已經(jīng)使用的錯誤 
    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

    bzero(&server,sizeof(server));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr("127.0.0.1"); //回送地址,指本地機碘裕,一般用來測試使用
    server.sin_port = htons(port);
    rt=bind(sockfd, (struct sockaddr *)& server, sizeof(server));
    if (rt== -1)
    {   
        perror("bind");
        exit(1);
    }

    addrlen=sizeof(client);
    while(1)
    {   //接收客戶端信息
        num=recvfrom(sockfd,rbuf,sizeof(rbuf),0,(struct sockaddr *)&client,&addrlen);
        if(num<0)   
        {  
            perror("recvfrom");  
            break;   
        }
        rbuf[num]='\0';

        //顯示客戶端信息携取,如果客戶端發(fā)來bye則退出循環(huán)
        printf("Got a message <%s> from client.\nIt's IP is %s,port is %d.\n", rbuf,inet_ntoa(client.sin_addr),ntohs(client.sin_port));
        if(strcmp(rbuf,"bye")==0)     
            break;
        //向客戶端發(fā)送welcome 
        sprintf(sendbuf,"welcome!");               
        num=sendto(sockfd,sendbuf,strlen(sendbuf),0,(struct sockaddr *)&client,addrlen);
        printf("server send %d bytes\n",num);
    }
    close(sockfd);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市帮孔,隨后出現(xiàn)的幾起案子雷滋,更是在濱河造成了極大的恐慌,老刑警劉巖你弦,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惊豺,死亡現(xiàn)場離奇詭異,居然都是意外死亡禽作,警方通過查閱死者的電腦和手機尸昧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旷偿,“玉大人烹俗,你說我怎么就攤上這事爆侣。” “怎么了幢妄?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵兔仰,是天一觀的道長。 經(jīng)常有香客問我乎赴,道長榕吼,這世上最難降的妖魔是什么羹蚣? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮胁出,結(jié)果婚禮上划鸽,老公的妹妹穿的比我還像新娘。我一直安慰自己型凳,他們只是感情好甘畅,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著槐脏,像睡著了一般堂氯。 火紅的嫁衣襯著肌膚如雪咽白。 梳的紋絲不亂的頭發(fā)上晶框,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音畴蒲,去河邊找鬼。 笑死蔫骂,一個胖子當(dāng)著我的面吹牛辽旋,可吹牛的內(nèi)容都是我干的补胚。 我是一名探鬼主播溶其,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼瓶逃,長吁一口氣:“原來是場噩夢啊……” “哼厢绝!你這毒婦竟也來了昔汉?” 一聲冷哼從身側(cè)響起挤庇,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤渴语,失蹤者是張志新(化名)和其女友劉穎驾凶,沒想到半個月后调违,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體技肩,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年屉符,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袋马。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖碑宴,靈堂內(nèi)的尸體忽然破棺而出软啼,到底是詐尸還是另有隱情,我是刑警寧澤延柠,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布祸挪,位于F島的核電站,受9級特大地震影響贞间,放射性物質(zhì)發(fā)生泄漏贿条。R本人自食惡果不足惜雹仿,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望整以。 院中可真熱鬧胧辽,春花似錦、人聲如沸公黑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凡蚜。三九已至人断,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朝蜘,已是汗流浹背恶迈。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谱醇,地道東北人暇仲。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像枣抱,于是被迫代替她去往敵國和親熔吗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

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