udp廣播測試程序

本程序主要是為了熟悉udp廣播的測試程序吃警,借鑒網(wǎng)上的程序

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <string.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <sys/types.h>  
#include <netdb.h>  
#include <sys/ioctl.h>  
#include <net/if.h>  

#define CLIENT_PORT 8899

#define DEBUF_CHECK(X, Y) \
    do{\
        if (X < 0){\
            perror(Y);\
            printf("%s %s %d %s error\r\n", __FILE__, __func__, __LINE__, Y);\
        }\
    }while(0)

int main(int argc, char *argv[])
{
    int ret;
    
    struct ifreq ifr; 

    int iSocket = socket(AF_INET, SOCK_DGRAM, 0);
    DEBUF_CHECK(iSocket, "create socket");
    printf("--------------\r\n");
    struct sockaddr_in server_addr;
    memset((char *)&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(9999);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    printf("-------1-------\r\n");
    ret = bind(iSocket, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
    DEBUF_CHECK(ret , "bind error");
    printf("-------2----%d---\r\n",sizeof(ifr.ifr_name));
    strcpy(ifr.ifr_name, "ens33"); //Currently, only get eth0

    printf("-------3-------\r\n");
    ret = ioctl(iSocket, SIOCGIFBRDADDR, &ifr);
    DEBUF_CHECK(ret , "ioctl error");

    struct sockaddr_in broadcast_addr;
    //memcpy(&broadcast_addr, (char *)&ifr->ifr_broadaddr, sizeof(struct sockaddr_in));  
    printf("-------3-------\r\n");
    broadcast_addr.sin_family = AF_INET;
    broadcast_addr.sin_port = htons(CLIENT_PORT);
    printf("-------4-------\r\n");
    //printf("\nBroadcast-IP: %s\r\n", inet_ntoa(broadcast_addr.sin_addr));  
    return 0;
}

以上程序主要用于測試ioctl函數(shù)是否正常運行牧嫉,之前定義的struct ifreq *ifr;但是沒有對ifr初始化炊汹,ioctl報錯:error not found device。為了測試簡單改為struct ifreq ifr

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if.h>

#define IP_FOUND "IP_FOUND"  
#define IP_FOUND_ACK "IP_FOUND_ACK"  
#define IFNAME "ens33"  
#define MCAST_PORT 9999  
 
void set_broadcast(int *socket_fd, struct sockaddr_in *broadcast_addr, char *buffer)
{
    int j = 0;
    int ret;
    int so_broadcast = 1;  
    struct ifreq *ifr;  
    struct ifconf ifc;  

    int iSocket = *socket_fd;
    // 獲取所有套接字接口  

    ifc.ifc_len = sizeof(buffer);  
    ifc.ifc_buf = buffer;  

    if (ioctl(iSocket, SIOCGIFCONF, (char *) &ifc) < 0)  
    {  
        perror("ioctl-conf:");  
        return;  
    }  
  
  // //查找當(dāng)前網(wǎng)卡名
    ifr = ifc.ifc_req;  
  //   for (j = (ifc.ifc_len/sizeof(struct ifreq)); --j >= 0; ifr++)  
  //   {  
  //       if (!strcmp(ifr->ifr_name, "eth0"))  
  //       {  
  //           if (ioctl(iSocket, SIOCGIFFLAGS, (char *)ifr) < 0)  
  //           {  
  //               perror("ioctl-get flag failed:");  
  //           }  
  //           break;  
  //       }  
  //   }
    //指定固定的網(wǎng)卡執(zhí)行
    strncpy(ifr->ifr_name, IFNAME, strlen(IFNAME)); 
    if (ioctl(iSocket, SIOCGIFBRDADDR, ifr) == -1)  
    {  
        perror("ioctl error");  
        return;  
    }  

    //將獲得的廣播地址復(fù)制到broadcast_addr  
    memcpy(broadcast_addr, (char *)&ifr->ifr_broadaddr, sizeof(struct sockaddr_in));  
    //設(shè)置廣播端口號  
    printf("\nBroadcast-IP: %s\r\n", inet_ntoa(broadcast_addr->sin_addr));  
    broadcast_addr->sin_family = AF_INET;  
    broadcast_addr->sin_port = htons(8899);  
  //    broadcast_addr->sin_addr = inet_addr("192.168.0.255");
    //默認(rèn)的套接字描述符sock是不支持廣播囚灼,必須設(shè)置套接字描述符以支持廣播  
   ret = setsockopt(iSocket, SOL_SOCKET, SO_BROADCAST, &so_broadcast,  
            sizeof(so_broadcast));  
    if(ret < 0)
    {
        perror("setsockopt error");
        return;
    }
}

int main(int argc, char* argv[])
{
    int ret = -1;
    int iSocket = -1;
    int count;
    struct sockaddr_in server_addr; //服務(wù)器端地址  
    struct sockaddr_in client_addr; //客戶端地址  

    struct timeval timeout;  
    char buffer[1024];
    int client_ilen = sizeof(struct sockaddr_in);

    iSocket = socket(AF_INET, SOCK_DGRAM, 0); //建立數(shù)據(jù)報套接字  
    if (iSocket == -1)
    {
        perror("iSocketet error");
        return -1;
    }

    memset((void*)&server_addr, 0, sizeof(struct sockaddr_in));  
    server_addr.sin_family = AF_INET;  
    server_addr.sin_addr.s_addr = htons(INADDR_ANY );  
    server_addr.sin_port = htons(MCAST_PORT);  

    set_broadcast(&iSocket, &client_addr, buffer);
    //將地址結(jié)構(gòu)綁定到套接字上  
     ret = bind(iSocket, (struct sockaddr *)&server_addr, sizeof(server_addr));  
     if (ret < 0)  
     {  
        perror("bind error");  
        return -1;  
    }  
    printf("bind ok\r\n");

   
    fd_set readfd; //讀文件描述符集合
    while(1)
    {
        timeout.tv_sec = 1000;  
        timeout.tv_usec = 0;  

        //文件描述符集合清0  
        FD_ZERO(&readfd);  
        //將套接字描述符加入到文件描述符集合  
        FD_SET(iSocket, &readfd);  
        //select偵聽是否有數(shù)據(jù)到來  
        ret = select(iSocket + 1, &readfd, NULL, NULL, &timeout); //偵聽是否可讀 
        switch(ret)
        {
            case -1: //發(fā)生錯誤  
                perror("select error:");  
                break;  
            case 0: //超時  
                printf("select timeout\n");  
                break;  
            default:
                if (FD_ISSET(iSocket, &readfd))  
                {  
                    //count = recvfrom(iSocket, buffer, 1024, 0, (struct sockaddr *)&client_addr, &client_ilen); //接收客戶端發(fā)送的數(shù)據(jù)  
                    count = recvfrom(iSocket, buffer, 1024, 0, NULL, NULL); //接收客戶端發(fā)送的數(shù)據(jù)  

            
                    printf("recv count = %d\r\n", count);
              
                     printf("\nClient connection information:\n\t IP: %s, Port: %d\n",  
                                (char *)inet_ntoa(client_addr.sin_addr),  
                                 ntohs(client_addr.sin_port));  

                     //將數(shù)據(jù)發(fā)送給客戶端  
                         memcpy(buffer, IP_FOUND_ACK, strlen(IP_FOUND_ACK) + 1);  
                         count = sendto(iSocket, buffer, strlen(buffer), 0,  
                                 (struct sockaddr *)&client_addr, client_ilen);  
                  
                }  
        
        }
    }    

}

此程序是個簡單udp廣播發(fā)送服務(wù)器特铝,測試自動獲取網(wǎng)卡的廣播地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市棍郎,隨后出現(xiàn)的幾起案子其障,更是在濱河造成了極大的恐慌,老刑警劉巖涂佃,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件励翼,死亡現(xiàn)場離奇詭異蜈敢,居然都是意外死亡,警方通過查閱死者的電腦和手機抚笔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門扶认,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人殊橙,你說我怎么就攤上這事辐宾。” “怎么了膨蛮?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵叠纹,是天一觀的道長。 經(jīng)常有香客問我敞葛,道長誉察,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任惹谐,我火速辦了婚禮持偏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氨肌。我一直安慰自己鸿秆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布怎囚。 她就那樣靜靜地躺著卿叽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恳守。 梳的紋絲不亂的頭發(fā)上考婴,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音催烘,去河邊找鬼沥阱。 笑死,一個胖子當(dāng)著我的面吹牛颗圣,可吹牛的內(nèi)容都是我干的喳钟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼在岂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蛮寂?” 一聲冷哼從身側(cè)響起蔽午,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酬蹋,沒想到半個月后及老,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抽莱,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年骄恶,在試婚紗的時候發(fā)現(xiàn)自己被綠了食铐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡僧鲁,死狀恐怖虐呻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寞秃,我是刑警寧澤斟叼,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站春寿,受9級特大地震影響朗涩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绑改,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一谢床、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧厘线,春花似錦识腿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至费薄,卻和暖如春硝全,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背楞抡。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工伟众, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人召廷。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓凳厢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親竞慢。 傳聞我的和親對象是個殘疾皇子先紫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

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