您的位置:首页 > 运维架构 > Linux

linux 多网卡发送udp广播

2017-04-03 15:28 225 查看
一、客户端代码

#include <stdio.h>

#include <netdb.h>

#include <time.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <string.h>

#include <arpa/inet.h>

int Create_destIpSendBrocast(const char *ipaddress,int port,struct sockaddr_in *addrServer){

        if(ipaddress==NULL){

                return -1;

        }

        int sockClient  = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

        if (sockClient<0){

                printf ("socket create failed. ip=[%s] \n ", ipaddress);

                return  -1;

        }

        int bBroadcast = 1;

        if (0 != setsockopt ( sockClient,SOL_SOCKET,SO_BROADCAST, (char *)&bBroadcast, sizeof(int))){

                printf ("setsockopt failed. ip=[%s] ", ipaddress);

                goto exit0;

        }

        struct sockaddr_in addrClient   = {0};

        addrClient.sin_family   = AF_INET;

        addrClient.sin_addr.s_addr      = inet_addr(ipaddress);

        addrClient.sin_port     = 0;    /// 0 表示由系统自动分配端口号

        if (0 != bind (sockClient, (struct sockaddr*)&addrClient, sizeof(addrClient))){

                printf ("bind failed.ip=[%s] \n", ipaddress);

                goto exit0;

        }

        addrServer->sin_family = AF_INET;

        addrServer->sin_addr.s_addr = htonl ( INADDR_BROADCAST );

        addrServer->sin_port = htons (port);

        return sockClient;

exit0:

        close(sockClient);

        return  -1;

}

void  *ThreadProc(void * arg){

        char    szIp[16] = {0};

        strcpy (szIp, (char*)arg);

        int     nConunter = 0;

        struct sockaddr_in addrServer;

        int sockClient = Create_destIpSendBrocast((const char *)szIp,10000,&addrServer);

        while(1) {

                char pcSendMsg[1024] = {0};

                time_t  rawTime;

                time(&rawTime);

                struct tm  *t = localtime(&rawTime);

                sprintf(pcSendMsg, "%04d-%02d-%02d %02d-%02d-%02d | ip=[%s]", t->tm_year+1900, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, szIp);

                sendto ( sockClient, pcSendMsg, strlen(pcSendMsg)+1, 0, (struct sockaddr *) &addrServer, sizeof ( struct sockaddr_in ));

                printf("%s\n",pcSendMsg);

                sleep(1);

        }

        close(sockClient);

        return  NULL;

}

int main(void){

        char hostname[1024] = {0};

        gethostname(hostname, sizeof(hostname));    //获得本地主机名

        printf("hostname = %s\n",hostname);

        struct hostent * hostinfo = gethostbyname(hostname);//信息结构体

        struct in_addr **addr_list;

        addr_list = (struct in_addr **)hostinfo->h_addr_list;

        int i=0;

             for(i = 0; addr_list[i] != NULL; i++) {

                char *ip = inet_ntoa(*addr_list[i]);

                if(ip!=NULL){

                        printf("%s %s \n", __func__,inet_ntoa(*addr_list[i]));

                        pthread_t tid;

                        pthread_create(&tid, 0, ThreadProc, ip);

                }

        }

        while(1){

                pause();

        }

        printf("exit\n");

        return 0;

}

 

   

二、服务端代码

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

void init_addr(struct sockaddr_in *addr, char *ip,  int port)

{
addr->sin_family = AF_INET;
 
addr->sin_port = htons(port);
 if(ip == NULL)
addr->sin_addr.s_addr = htonl(INADDR_ANY);
else
addr->sin_addr.s_addr = inet_addr(ip);

}

int create_listen_brocast(char *ipaddr,int port)

{
struct sockaddr_in addr;
const int on=1;
int fd = socket(AF_INET,SOCK_DGRAM,0);
if(fd == -1)

{
perror("create udp socket fail!");
return -1;

}
init_addr(&addr, ipaddr,  port);
if(setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on))<0)

  {

    printf("init broadcast setsockopt failed \n");

    return -1;

  }
if (bind(fd, (struct sockaddr*)&addr, sizeof(struct sockaddr))<0)
{
  printf("bind broadcast failed\n");
  return -1;
}
return fd;

}

int main(int argc,char **argv)

{

        //int sock = create_listen_udp(NULL,10000);

        int sock = create_listen_brocast(NULL,10000);

        if(sock<0){

                printf("create sock failed \n");

                return -1;

        }

        ssize_t ret = 0;

        char buf[128]={0};

        struct sockaddr_in src_addr;

        int len = sizeof(struct sockaddr_in);

        while(1){

                ret =recvfrom(sock,(void *)buf , 128, 0,(struct sockaddr *)&src_addr, (socklen_t *)&len);

                if(ret<=0){

                        usleep(100);

                        continue;

                }

                printf("ret = %d\n",ret);

        }

        return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux udp广播