1. 程式人生 > >linux 多網絡卡傳送udp廣播

linux 多網絡卡傳送udp廣播

一、客戶端程式碼

#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;
}