c网络编程-多播
- /* 编译通过环境,Windows XP sp2,Windows 2003 server SDK,VC++6.0 sp5. */
- /************************************************************************
- * File: UDP group broadcast header file
- * Author: WenXiaoyong,Wen_kernel@163.com
- * Copyright: (C) WenXiaoyong,2007
- *
- ************************************************************************/
- #ifndef UDP_GROUP_BROADCAST_H
- #define UDP_GROUP_BROADCAST_H
- #include <stdio.h>
- #include <Winsock2.h>
- #include <Ws2tcpip.h>
- #include <stdlib.h>
- #pragma comment(lib, "Ws2_32.lib")
- /* define microes */
- /* declare extern variables */
- extern SOCKET gServerSocket;
- extern SOCKET gClientSocket;
- extern char gServerIP[];
- extern char gClientIP[];
- /* declare functions */
- /* server */
- int CreatServerUDPSocket(SOCKET *pServerSocket, char chServerIP[], /
- unsigned short uPort);
- int SetSocketOption(SOCKET *pServerSocket, int nLevel,/
- int nOptname, const char FAR *pOptval, int nOptlen);
- int SendTo(SOCKET *pServerSocket, char *pBuff, int nOffset, int nLen);
- /* client */
- int CreatClientUDPSocket(SOCKET *pClientSocket, char chClientIP[], /
- unsigned short uPort);
- int ReciveFrom(SOCKET *pSocket, char pBuff[], int nOffset, int nLen);
- #endif /* UDP_GROUP_BROADCAST_H */
- /************************************************************************
- * File: main funtion file
- * Author: WenXiaoyong,Wen_kernel@163.com
- * Copyright: (C) WenXiaoyong,2007
- *
- ************************************************************************/
- #include "E:/MyDevLib/Windows/UDP_GroupBroadcast.h"
- #include <error.h>
- #include <assert.h>
- /* define microes */
- #define MAX_REC_BUFF_LEN 128
- #define TIME_SLEEP 100 /* milliseconds */
- #define PORT_UDP 1225
- /* main function */
- int main( int argc, char *argv[], char *envp[])
- {
- long lCount;
- int nReturn;
- char chRecBuff[MAX_REC_BUFF_LEN];
- const int nOn = 1; /* 允许程序的多个实例运行在同一台机器上 */
- int nReciveCount;
- /* config IP */
- if(argc == 2)
- {
- memcpy(gClientIP, argv[1], strlen(argv[1]));
- printf("Note: config IP[%s]./n", argv[1]);
- }
- /* creat a UDP socket */
- nReturn = CreatClientUDPSocket(&gClientSocket, gClientIP, PORT_UDP);
- if(!nReturn)
- {
- printf("Note: creat a client UDP socket OK./n");
- }
- else
- {
- printf("Error: creat a client UDP socket was failed! [error=%d]/n", nReturn);
- goto error_exit;
- }
- /* recive data */
- printf("Note: beginning recive data .../n");
- lCount = 1;
- nReciveCount = 15;
- while(1)
- {
- memset(chRecBuff, 0, sizeof(chRecBuff));
- nReturn = ReciveFrom(&gClientSocket, chRecBuff, 0, sizeof(chRecBuff));
- if (!nReturn)
- {
- printf("Note: recived data[%s]./n", chRecBuff);
- }
- else
- {
- printf("Error: recive data was failed! [error=%d]/n", WSAGetLastError());
- goto error_exit;
- }
- Sleep(TIME_SLEEP);
- }
- error_exit:
- closesocket(gClientSocket);
- WSACleanup();
- printf("Note: process exit./n");
- return 0;
- }
- /************************************************************************
- * File: main funtion file
- * Author: WenXiaoyong,Wen_kernel@163.com
- * Copyright: (C) WenXiaoyong,2007
- *
- ************************************************************************/
- #include "E:/MyDevLib/Windows/UDP_GroupBroadcast.h"
- #include <error.h>
- #include <assert.h>
- /* define microes */
- #define MAX_SEND_BUFF_LEN 128
- #define TIME_SLEEP 100 /* milliseconds */
- #define PORT_UDP 1225
- /* main function */
- int main( int argc, char *argv[], char *envp[])
- {
- long lCount;
- int nReturn, nSendFlag;
- char chSendBuff[MAX_SEND_BUFF_LEN];
- memset(chSendBuff, 0, sizeof(chSendBuff));
- /* config IP */
- if(argc == 2)
- {
- memcpy(gServerIP, argv[1], strlen(argv[1]));
- printf("Note: config IP[%s]./n", argv[1]);
- }
- /* creat a UDP socket */
- nReturn = CreatServerUDPSocket(&gServerSocket, gServerIP, PORT_UDP);
- if(!nReturn)
- {
- printf("Note: creat server UDP socket OK./n");
- }
- else
- {
- printf("Error: creat server UDP socket was failed! [error=%d]/n", nReturn);
- goto error_exit;
- }
- printf("Note: beginning send data .../n");
- lCount = 1;
- nSendFlag = 0x8;
- while(/*nSendFlag*/1)
- {
- /* send some datas */
- nSendFlag = lCount != 0xf;
- sprintf(chSendBuff, "Wenxy test %d", lCount++);
- nReturn = SendTo(&gServerSocket, chSendBuff, 0, strlen(chSendBuff));
- if(!nReturn)
- {
- printf("Note: send data [%s]./n", chSendBuff);
- }
- else
- {
- printf("Error: send data was failed! [error=%d]/n", nReturn);
- goto error_exit;
- }
- Sleep(TIME_SLEEP);
- }
- error_exit:
- closesocket(gServerSocket);
- WSACleanup();
- printf("Note: process exit./n");
- return 0;
- }
- /************************************************************************
- * File: UDP group broadcast implement file
- * Author: WenXiaoyong,Wen_kernel@163.com
- * Copyright: (C) WenXiaoyong,2007
- *
- ************************************************************************/
- #include "UDP_GroupBroadcast.h"
- /* define microes */
- #define PORT_UDP_SERVER 1225
- #define IP_SERVER "192.168.1.125"
- #define IP_MULTICAST "224.0.0.99" /* 多播地址 */
- #define MAX_IP_LEN 16
- /* globals variables */
- SOCKET gServerSocket, gClientSocket;
- char gServerIP[MAX_IP_LEN];
- char gClientIP[MAX_IP_LEN];
- struct sockaddr_in gServerAddr;
- struct sockaddr_in gClientAddr;
- /* functions */
- int CreatServerUDPSocket(SOCKET *pServerSocket, char chServerIP[], /
- unsigned short uPort)
- {
- unsigned long ulOptval;
- unsigned short uVersionRequested;
- WSADATA wsaData;
- struct ip_mreq mreq;
- const int nOn = 1; /* 允许程序的多个实例运行在同一台机器上 */
- const int nRouteTTL = 10;
- const int loopback = 0; /* 禁止回馈 */
- uVersionRequested = MAKEWORD(2, 2);
- if(0 != WSAStartup(uVersionRequested, &wsaData))
- {
- return WSAGetLastError();
- }
- *pServerSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
- if(INVALID_SOCKET == *pServerSocket)
- {
- WSACleanup();
- return WSAGetLastError();
- }
- /* allow rebind for other instance */
- #if 0
- if(SOCKET_ERROR == setsockopt(*pServerSocket, SOL_SOCKET, /
- SO_REUSEADDR, (char *)&nOn, sizeof(nOn)))
- {
- closesocket(*pServerSocket);
- WSACleanup();
- return WSAGetLastError();
- }
- #endif
- /* set route TTL */
- if(SOCKET_ERROR == setsockopt(*pServerSocket, IPPROTO_IP, IP_MULTICAST_TTL, /
- (char *)&nRouteTTL, sizeof(nRouteTTL)))
- {
- closesocket(*pServerSocket);
- WSACleanup();
- return WSAGetLastError();
- }
- /* no loop back */
- if(SOCKET_ERROR == setsockopt(*pServerSocket, IPPROTO_IP, IP_MULTICAST_LOOP, /
- (char*)&loopback, sizeof(loopback)))
- {
- closesocket(*pServerSocket);
- WSACleanup();
- return WSAGetLastError();
- }
- /* bind */
- memset(&gServerAddr, 0, sizeof(struct sockaddr_in));
- gServerAddr.sin_family = AF_INET;
- gServerAddr.sin_addr.s_addr = inet_addr(chServerIP); /* INADDR_ANY; */
- gServerAddr.sin_port = htons(uPort);
- if(SOCKET_ERROR == bind(*pServerSocket, &gServerAddr, sizeof(gServerAddr)))
- {
- closesocket(*pServerSocket);
- WSACleanup();
- return WSAGetLastError();
- }
- /* join a group of multicast */
- memset(&mreq, 0, sizeof(mreq));
- mreq.imr_interface.S_un.S_addr = inet_addr(chServerIP);
- mreq.imr_multiaddr.S_un.S_addr = inet_addr(IP_MULTICAST);
- if(SOCKET_ERROR == setsockopt(*pServerSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP,/
- &mreq, sizeof(mreq)))
- {
- closesocket(*pServerSocket);
- WSACleanup();
- return WSAGetLastError();
- }
- return 0;
- }
- int SetSocketOption(SOCKET *pSocket, int nLevel,/
- int nOptname, const char FAR *pOptval, int nOptlen)
- {
- if(SOCKET_ERROR == setsockopt(*pSocket, nLevel, /
- nOptname, pOptval, nOptlen))
- {
- return WSAGetLastError();
- }
- return 0;
- }
- int ReciveFrom(SOCKET *pSocket, char pBuff[], int nOffset, int nLen)
- {
- struct sockaddr_in ClientAddr;
- int nReturn = 0, nAddrLen;
- memset(&ClientAddr, 0, sizeof(struct sockaddr_in));
- nAddrLen = sizeof(ClientAddr);
- nReturn = recvfrom(*pSocket, pBuff, nLen, /
- 0, (struct sockaddr *)&ClientAddr, &nAddrLen);
- #if 0
- memcpy(pBuff, "wenxy", sizeof("wenxy"));
- nReturn = 5;
- #endif
- if(nReturn == SOCKET_ERROR)
- {
- return -1;
- }
- return 0;
- }
- int SendTo(SOCKET *pServerSocket, char *pBuff, int nOffset, int nLen)
- {
- int nSendLen;
- struct sockaddr_in remote;
- memset(&remote, 0, sizeof(remote));
- remote.sin_addr.s_addr = inet_addr ( IP_MULTICAST );
- remote.sin_family = AF_INET;
- remote.sin_port = htons(PORT_UDP_SERVER);
- nSendLen = sendto(*pServerSocket, pBuff, nLen, 0, /
- (struct sockaddr *)&remote, sizeof(remote));
- if(nSendLen <= 0)
- {
- return WSAGetLastError();
- }
- return 0;
- }
- /************************************************************************/
- /* client functions */
- int CreatClientUDPSocket(SOCKET *pClientSocket, char chClientIP[], /
- unsigned short uPort)
- {
- unsigned long ulOptval;
- unsigned short uVersionRequested;
- WSADATA wsaData;
- struct ip_mreq mreq;
- const int nOn = 1;
- uVersionRequested = MAKEWORD(2, 2);
- if(0 != WSAStartup(uVersionRequested, &wsaData))
- {
- return WSAGetLastError();
- }
- *pClientSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
- if(INVALID_SOCKET == *pClientSocket)
- {
- closesocket(*pClientSocket);
- WSACleanup();
- return WSAGetLastError();
- }
- #if 0
- /* set socket option */
- if(SOCKET_ERROR == setsockopt(*pClientSocket, SOL_SOCKET, /
- SO_REUSEADDR, (char *)&nOn, sizeof(nOn)))
- {
- closesocket(*pClientSocket);
- WSACleanup();
- return WSAGetLastError();
- }
- #endif
- #if 1
- /* bind */
- memset(&gClientAddr, 0, sizeof(gClientAddr));
- gClientAddr.sin_family = AF_INET;
- gClientAddr.sin_addr.s_addr = inet_addr(chClientIP);
- gClientAddr.sin_port = htons( uPort );
- if(SOCKET_ERROR == bind(*pClientSocket, &gClientAddr, sizeof(gClientAddr)))
- {
- closesocket(*pClientSocket);
- WSACleanup();
- return WSAGetLastError();
- }
- #endif
- /* join a group of multicast */
- memset(&mreq, 0, sizeof(mreq));
- mreq.imr_interface.S_un.S_addr = inet_addr(chClientIP);
- mreq.imr_multiaddr.S_un.S_addr = inet_addr(IP_MULTICAST);
- if(SOCKET_ERROR == setsockopt(*pClientSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP,/
- &mreq, sizeof(mreq)))
- {
- closesocket(*pClientSocket);
- WSACleanup();
- return WSAGetLastError();
- }
- return 0;
- }
c网络编程-多播的更多相关文章
- Linux网络编程--多播
一.多播介绍 什么是多播? 单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信.单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信.实际情 ...
- linux网络编程之一-----多播(组播)编程
什么是多播 组播(Multicast)是网络一种点对多(one to many)的通信方式,通过报文复制完成网络中一台server对应多台接收者的高效数据传 送.对其形象的比喻就是类似于广播电台和电视 ...
- c++ 网络编程(六)LINUX下 socket编程 多播与广播 实现一次发送所有组客户端都能接收到
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614288.html 一.多播 锲子:有这么一种情况,网络电台可能需要同时向成千上万的用户传输 ...
- TCP/IP网络编程之多播与广播
多播 多播方式的数据传输是基于UDP完成的,因此,与UDP服务端/客户端的实现非常接近.区别在于,UDP数据传输以单一目标进行,而多播数据同时传递到加入(注册)特定组的大量主机.换言之,采用多播方式时 ...
- Linux IO模型和网络编程模型
术语概念描述: IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者. 阻塞和非阻塞,是函数/方法的实现方式,即在数据就绪之前是立刻返回还是等待. 以文件IO为例,一个IO读过程是文件 ...
- UNIX网络编程-基本API介绍(二)
参考链接:http://www.cnblogs.com/riky/archive/2006/11/24/570713.aspx 1.getsockname和getpeername getsocknam ...
- Unix网络编程--卷一:套接字联网API
UNIX网络编程--卷一:套接字联网API 本书面对的读者是那些希望自己编写的程序能够使用成为套接字(socket)的API进行彼此通信的人. 目录: 0.准备环境 1.简介 2.传输层:TCP.UD ...
- Android网络编程系列 一 TCP/IP协议族
在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...
- 【Java基础】Java网络编程基础知识
什么是网络编程 网络编程是通过使用套接字来达到进程间通信目的,那什么是套接字呢?其实套接字是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的 ...
随机推荐
- Python 多进程 一分钟下载二百张图片 是什么样子的体验
需要爬取国内某个网站,但是这个网站封ip,没办法,只能用代理了,然后构建自己的代理池,代理池维护了20条进程, 所用的网络是20M带宽,实际的网速能达到2.5M,考虑到其他原因,网速未必能达到那么多. ...
- mysql分组取每组前几条记录(排序)
首先来造一部分数据,表mygoods为商品表,cat_id为分类id,goods_id为商品id,status为商品当前的状态位(1:有效,0:无效). CREATE TABLE `mygoods` ...
- [Codility] CommonPrimeDivisors
A prime is a positive integer X that has exactly two distinct divisors: 1 and X. The first few prime ...
- 【Android】19.1 SharedPreferences类
分类:C#.Android.VS2015: 创建日期:2016-03-05 一.简介 SharedPreferences:简单共享存储首选项.实际上就是用加密的内部文件保存所有页面都能访问的一系列“n ...
- Python框架级编程的能力要求
说在前面:比较基础的就不说 1.装饰器熟练掌握 2.内建函数,内建变量.下划线函数之类的东西要搞明白 3.一定Python数据接口和算法实现能力 4.内省 5.元编程
- 在Ubuntu环境中qemu-kvm网桥的配置
在文件/etc/network/interfaces中添加以下内容 auto lo iface lo inet loopback #auto eth0 #iface eth0 inet manual ...
- 配置PyCharm(背景色+字体大小+解释器选择)
首先配置PyCharm的背景,快捷键组合,视图模式和风格. 使用快捷键Ctrl + "`"(该键位于键盘的左上角,和”~“同一个键位),即可开发上图配置选项. color Sche ...
- JAVA-JSP声明语句
相关资料: <21天学通Java Web开发> 结果总结: 1.<%! %>声明的变量为全局变量. 实例代码: <html> <head> <ti ...
- excel自定义函数添加和使用方法
第一,excel自定义函数简介 Excel自带很多函数供使用,但有些问题用内置函数解决起来很复杂,甚至是无能为力,这时就可以利用VBA开发自定义函数. 第二,excel如何添加自定义函数 excel自 ...
- 【WPF】TabControl垂直分页栏/选项卡
分页栏控件TabControl默认的选项卡是水平方向的,如下: 现在要改成垂直方向的: 给TabControl 标签添加属性 TabStripPlacement=”Left” , 如下: <Ta ...