⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udp.c

📁 C语言源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*加载库文件*/
#pragma comment( lib, "ws2_32.lib" )
/*加载头文件*/
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>

/*定义多播常量*/
#define MCASTADDR     "224.3.5.8"
#define MCASTPORT     25000
#define BUFSIZE       1024
#define MCOUNT        10

/*定义广播常量*/
#define BCASTPORT     5050
#define BCOUNT        10

/*定义广播全局变量*/
SOCKET             socketBro;
SOCKET             socketRec;
struct sockaddr_in addrBro;
struct sockaddr_in addrRec;
BOOL               broadSendFlag;
BOOL               broadFlag;

DWORD              bCount;
DWORD              bcastAddr;
short              bPort;

/*定义多播全局变量*/
SOCKET             socketMul;
SOCKET             sockJoin;
struct sockaddr_in addrLocal;
struct sockaddr_in addrMul;

BOOL               multiSendFlag;
BOOL               bLoopBack;    
BOOL               multiFlag;

DWORD              dwInterface;  
DWORD              dwMulticastGroup;
DWORD              mCount;         
short              mPort;           

/*自定义函数*/
void initial();
void GetArgments(int argc, char **argv);

void userHelpAll();
void userHelpBro();
void userHelpMul();

void broadcastSend();
void broadcastRec();

void mulControl();
void multicastSend();
void multicastRec();

/*初始化全局变量函数*/
void initial()
{
    /*初始化广播全局变量*/
    bPort = BCASTPORT;
    bCount = BCOUNT;
    bcastAddr = INADDR_BROADCAST;
    broadSendFlag = FALSE;
    broadFlag = FALSE;
    multiFlag = FALSE;

    /*初始化多播全局变量*/
    dwInterface = INADDR_ANY;
    dwMulticastGroup = inet_addr(MCASTADDR);
    mPort = MCASTPORT;
    mCount = MCOUNT;
    multiSendFlag = FALSE;
    bLoopBack = FALSE;
}

/*参数获取函数*/
void GetArgments(int argc, char **argv)
{
    int i;
    /*如果参数个数小于2个*/
    if(argc<=1)
    {
        userHelpAll();
        return ;
    }
    /*获取广播选项*/
    if(argv[1][0]=='-'&&argv[1][1]=='b')
    {
        /*广播标志设置为真*/
        broadFlag = TRUE;
        for(i=2; i < argc ;i++)
    	{
            if (argv[i][0] == '-')
    		{
                switch (tolower(argv[i][1]))
        		{
                    /*如果是发送者*/
                	case 's': 
                        broadSendFlag = TRUE;
            			break;
                    /*广播的地址*/
                	case 'h':
                        if (strlen(argv[i]) > 3)
                            bcastAddr = inet_addr(&argv[i][3]);
            			break;
                    /*广播的端口号*/
                	case 'p':
                        if (strlen(argv[i]) > 3)
                            bPort = atoi(&argv[i][3]);
            			break;
                    /*广播(接收或者发送)的数量*/
                	case 'n': 
                        bCount = atoi(&argv[i][3]);
            			break;
                    /*其他情况显示用户帮助,终止程序*/
                	default:
        				{
                        	userHelpBro();
                        	ExitProcess(-1);
        				}
            			break;
        		}
    		}
    	}
        return ;
    }

    /*获取多播选项*/
    if(argv[1][0]=='-'&&argv[1][1]=='m')
    {
        /*多播标志设置为真*/
        multiFlag = TRUE;
        for(i=2; i < argc ;i++)
    	{
            if (argv[i][0] == '-')
    		{
                switch (tolower(argv[i][1]))
        		{
                    /*如果是发送者*/
                	case 's': 
                        multiSendFlag = TRUE;
            			break;
                    /*多播地址*/
                	case 'h': 
                        if (strlen(argv[i]) > 3)
                            dwMulticastGroup = inet_addr(&argv[i][3]);
            			break;
                    /*本地接口地址*/
                	case 'i': 
                        if (strlen(argv[i]) > 3)
                            dwInterface = inet_addr(&argv[i][3]);
            			break;
                    /*多播端口号*/
                	case 'p': 
                        if (strlen(argv[i]) > 3)
                            mPort = atoi(&argv[i][3]);
            			break;
                    /*环回标志设置为真*/
                	case 'l': 
                        bLoopBack = TRUE;
            			break;
                    /*发送(接收)的数量*/
                	case 'n':
                        mCount = atoi(&argv[i][3]);
            			break;
                    /*其他情况,显示用户帮助,终止程序*/
                	default:
                    	userHelpMul();
            			break;
        		}
    		}
    	}
    
    }
    return;
}

/*全局用户帮助函数*/
void userHelpAll()
{
    printf("Please choose broadcast[-b] or multicast[-m] !\n"); 
    printf("userHelpAll: -b [-s][p][-h][-n] | -m[-s][-h][-p][-i][-l][-n]\n");
    userHelpBro();
    userHelpMul();
}

/*广播用户帮助函数*/
void userHelpBro()
{
    printf("Broadcast: -b -s:str -p:int -h:str -n:int\n");
    printf("           -b     Start the broadcast program.\n");
    printf("           -s     Act as server (send data); otherwise\n");
    printf("                  receive data. Default is receiver.\n");
    printf("           -p:int Port number to use\n ");
    printf("                  The default port is 5050.\n");
    printf("           -h:str The decimal broadcast IP address.\n");
    printf("           -n:int The Number of messages to send/receive.\n");
    printf("                  The default number is 10.\n");
}

/*多播用户帮助函数*/
void userHelpMul()
{
    printf("Multicast: -m -s -h:str -p:int -i:str -l -n:int\n");
    printf("           -m     Start the multicast program.\n");
    printf("           -s      Act as server (send data); otherwise\n");
    printf("                   receive data. Default is receiver.\n");
    printf("           -h:str  The decimal multicast IP address to join\n");
    printf("                   The default group is: %s\n", MCASTADDR);
    printf("           -p:int  Port number to use\n");
    printf("                   The default port is: %d\n", MCASTPORT);
    printf("           -i:str  Local interface to bind to; by default \n");
    printf("                   use INADDRY_ANY\n");
    printf("           -l      Disable loopback\n");
    printf("           -n:int  Number of messages to send/receive\n");
    ExitProcess(-1);
}

/*广播消息发送函数*/
void broadcastSend()
{
    /*设置广播的消息*/
    char *smsg="The message received is from sender!";
    BOOL opt=TRUE;
    int nlen=sizeof(addrBro);
    int ret;
    DWORD i=0;
    
    /*创建UDP套接字*/
    socketBro=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
    /*如果创建失败*/
    if(socketBro==INVALID_SOCKET)
    {
        printf("Create socket failed:%d\n",WSAGetLastError());
        WSACleanup();
        return;
    }
    
    /*设置广播地址各个选项*/
    addrBro.sin_family=AF_INET;
    addrBro.sin_addr.s_addr=bcastAddr;
    addrBro.sin_port=htons(bPort);
    
    /*设置该套接字为广播类型*/
    if (setsockopt(socketBro,SOL_SOCKET,SO_BROADCAST,(char FAR *)&opt,
                                        		sizeof(opt))==SOCKET_ERROR)
    /*如果设置失败*/
    {
        printf("setsockopt failed:%d",WSAGetLastError());
        closesocket(socketBro);
        WSACleanup();
        return;
    }
    /*循环发送消息*/
    while(i<bCount)
    {
        /*延迟1秒*/
        Sleep(1000);
        /*从广播地址发送消息*/
        ret=sendto(socketBro,smsg,256,0,(struct sockaddr*)&addrBro,nlen);
        /*如果发送失败*/
        if(ret==SOCKET_ERROR)
            printf("Send failed:%d",WSAGetLastError());
        /*如果发送成功*/
        else
        {		
            printf("Send message %d!\n",i);	
    	}
        i++;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -