1. /* 编译通过环境,Windows XP sp2,Windows 2003 server SDK,VC++6.0 sp5. */
  2. /************************************************************************
  3. * File: UDP group broadcast header file
  4. * Author: WenXiaoyong,Wen_kernel@163.com
  5. * Copyright: (C) WenXiaoyong,2007
  6. *
  7. ************************************************************************/
  8. #ifndef UDP_GROUP_BROADCAST_H
  9. #define UDP_GROUP_BROADCAST_H
  10. #include <stdio.h>
  11. #include <Winsock2.h>
  12. #include <Ws2tcpip.h>
  13. #include <stdlib.h>
  14. #pragma comment(lib, "Ws2_32.lib")
  15. /* define microes */
  16. /* declare extern variables */
  17. extern SOCKET gServerSocket;
  18. extern SOCKET gClientSocket;
  19. extern char gServerIP[];
  20. extern char gClientIP[];
  21. /* declare functions */
  22. /* server */
  23. int CreatServerUDPSocket(SOCKET *pServerSocket, char chServerIP[], /
  24. unsigned short uPort);
  25. int SetSocketOption(SOCKET *pServerSocket, int nLevel,/
  26. int nOptname, const char FAR *pOptval, int nOptlen);
  27. int SendTo(SOCKET *pServerSocket, char *pBuff, int nOffset, int nLen);
  28. /* client */
  29. int CreatClientUDPSocket(SOCKET *pClientSocket, char chClientIP[], /
  30. unsigned short uPort);
  31. int ReciveFrom(SOCKET *pSocket, char pBuff[], int nOffset, int nLen);
  32. #endif /* UDP_GROUP_BROADCAST_H */
  33. /************************************************************************
  34. * File: main funtion file
  35. * Author: WenXiaoyong,Wen_kernel@163.com
  36. * Copyright: (C) WenXiaoyong,2007
  37. *
  38. ************************************************************************/
  39. #include "E:/MyDevLib/Windows/UDP_GroupBroadcast.h"
  40. #include <error.h>
  41. #include <assert.h>
  42. /* define microes */
  43. #define MAX_REC_BUFF_LEN 128
  44. #define TIME_SLEEP 100 /* milliseconds */
  45. #define PORT_UDP 1225
  46. /* main function */
  47. int main( int argc, char *argv[], char *envp[])
  48. {
  49. long lCount;
  50. int nReturn;
  51. char chRecBuff[MAX_REC_BUFF_LEN];
  52. const int nOn = 1; /* 允许程序的多个实例运行在同一台机器上 */
  53. int nReciveCount;
  54. /* config IP */
  55. if(argc == 2)
  56. {
  57. memcpy(gClientIP, argv[1], strlen(argv[1]));
  58. printf("Note: config IP[%s]./n", argv[1]);
  59. }
  60. /* creat a UDP socket */
  61. nReturn = CreatClientUDPSocket(&gClientSocket, gClientIP, PORT_UDP);
  62. if(!nReturn)
  63. {
  64. printf("Note: creat a client UDP socket OK./n");
  65. }
  66. else
  67. {
  68. printf("Error: creat a client UDP socket was failed! [error=%d]/n", nReturn);
  69. goto error_exit;
  70. }
  71. /* recive data */
  72. printf("Note: beginning recive data .../n");
  73. lCount = 1;
  74. nReciveCount = 15;
  75. while(1)
  76. {
  77. memset(chRecBuff, 0, sizeof(chRecBuff));
  78. nReturn = ReciveFrom(&gClientSocket, chRecBuff, 0, sizeof(chRecBuff));
  79. if (!nReturn)
  80. {
  81. printf("Note: recived data[%s]./n", chRecBuff);
  82. }
  83. else
  84. {
  85. printf("Error: recive data was failed! [error=%d]/n", WSAGetLastError());
  86. goto error_exit;
  87. }
  88. Sleep(TIME_SLEEP);
  89. }
  90. error_exit:
  91. closesocket(gClientSocket);
  92. WSACleanup();
  93. printf("Note: process exit./n");
  94. return 0;
  95. }
  96. /************************************************************************
  97. * File: main funtion file
  98. * Author: WenXiaoyong,Wen_kernel@163.com
  99. * Copyright: (C) WenXiaoyong,2007
  100. *
  101. ************************************************************************/
  102. #include "E:/MyDevLib/Windows/UDP_GroupBroadcast.h"
  103. #include <error.h>
  104. #include <assert.h>
  105. /* define microes */
  106. #define MAX_SEND_BUFF_LEN 128
  107. #define TIME_SLEEP 100 /* milliseconds */
  108. #define PORT_UDP 1225
  109. /* main function */
  110. int main( int argc, char *argv[], char *envp[])
  111. {
  112. long lCount;
  113. int nReturn, nSendFlag;
  114. char chSendBuff[MAX_SEND_BUFF_LEN];
  115. memset(chSendBuff, 0, sizeof(chSendBuff));
  116. /* config IP */
  117. if(argc == 2)
  118. {
  119. memcpy(gServerIP, argv[1], strlen(argv[1]));
  120. printf("Note: config IP[%s]./n", argv[1]);
  121. }
  122. /* creat a UDP socket */
  123. nReturn = CreatServerUDPSocket(&gServerSocket, gServerIP, PORT_UDP);
  124. if(!nReturn)
  125. {
  126. printf("Note: creat server UDP socket OK./n");
  127. }
  128. else
  129. {
  130. printf("Error: creat server UDP socket was failed! [error=%d]/n", nReturn);
  131. goto error_exit;
  132. }
  133. printf("Note: beginning send data .../n");
  134. lCount = 1;
  135. nSendFlag = 0x8;
  136. while(/*nSendFlag*/1)
  137. {
  138. /* send some datas */
  139. nSendFlag = lCount != 0xf;
  140. sprintf(chSendBuff, "Wenxy test %d", lCount++);
  141. nReturn = SendTo(&gServerSocket, chSendBuff, 0, strlen(chSendBuff));
  142. if(!nReturn)
  143. {
  144. printf("Note: send data [%s]./n", chSendBuff);
  145. }
  146. else
  147. {
  148. printf("Error: send data was failed! [error=%d]/n", nReturn);
  149. goto error_exit;
  150. }
  151. Sleep(TIME_SLEEP);
  152. }
  153. error_exit:
  154. closesocket(gServerSocket);
  155. WSACleanup();
  156. printf("Note: process exit./n");
  157. return 0;
  158. }
  159. /************************************************************************
  160. * File: UDP group broadcast implement file
  161. * Author: WenXiaoyong,Wen_kernel@163.com
  162. * Copyright: (C) WenXiaoyong,2007
  163. *
  164. ************************************************************************/
  165. #include "UDP_GroupBroadcast.h"
  166. /* define microes */
  167. #define PORT_UDP_SERVER 1225
  168. #define IP_SERVER  "192.168.1.125"
  169. #define IP_MULTICAST  "224.0.0.99" /* 多播地址 */
  170. #define MAX_IP_LEN 16
  171. /* globals variables */
  172. SOCKET gServerSocket, gClientSocket;
  173. char gServerIP[MAX_IP_LEN];
  174. char gClientIP[MAX_IP_LEN];
  175. struct sockaddr_in gServerAddr;
  176. struct sockaddr_in gClientAddr;
  177. /* functions */
  178. int CreatServerUDPSocket(SOCKET *pServerSocket, char chServerIP[], /
  179. unsigned short uPort)
  180. {
  181. unsigned long ulOptval;
  182. unsigned short uVersionRequested;
  183. WSADATA wsaData;
  184. struct ip_mreq mreq;
  185. const int nOn = 1; /* 允许程序的多个实例运行在同一台机器上 */
  186. const int nRouteTTL = 10;
  187. const int loopback = 0; /* 禁止回馈 */
  188. uVersionRequested = MAKEWORD(2, 2);
  189. if(0 != WSAStartup(uVersionRequested, &wsaData))
  190. {
  191. return WSAGetLastError();
  192. }
  193. *pServerSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
  194. if(INVALID_SOCKET == *pServerSocket)
  195. {
  196. WSACleanup();
  197. return WSAGetLastError();
  198. }
  199. /* allow rebind for other instance */
  200. #if 0
  201. if(SOCKET_ERROR == setsockopt(*pServerSocket, SOL_SOCKET, /
  202. SO_REUSEADDR, (char *)&nOn, sizeof(nOn)))
  203. {
  204. closesocket(*pServerSocket);
  205. WSACleanup();
  206. return WSAGetLastError();
  207. }
  208. #endif
  209. /* set route TTL */
  210. if(SOCKET_ERROR == setsockopt(*pServerSocket, IPPROTO_IP, IP_MULTICAST_TTL, /
  211. (char *)&nRouteTTL, sizeof(nRouteTTL)))
  212. {
  213. closesocket(*pServerSocket);
  214. WSACleanup();
  215. return WSAGetLastError();
  216. }
  217. /* no loop back */
  218. if(SOCKET_ERROR == setsockopt(*pServerSocket, IPPROTO_IP, IP_MULTICAST_LOOP, /
  219. (char*)&loopback, sizeof(loopback)))
  220. {
  221. closesocket(*pServerSocket);
  222. WSACleanup();
  223. return WSAGetLastError();
  224. }
  225. /* bind */
  226. memset(&gServerAddr, 0, sizeof(struct sockaddr_in));
  227. gServerAddr.sin_family = AF_INET;
  228. gServerAddr.sin_addr.s_addr = inet_addr(chServerIP); /* INADDR_ANY; */
  229. gServerAddr.sin_port = htons(uPort);
  230. if(SOCKET_ERROR == bind(*pServerSocket, &gServerAddr, sizeof(gServerAddr)))
  231. {
  232. closesocket(*pServerSocket);
  233. WSACleanup();
  234. return WSAGetLastError();
  235. }
  236. /* join a group of multicast */
  237. memset(&mreq, 0, sizeof(mreq));
  238. mreq.imr_interface.S_un.S_addr = inet_addr(chServerIP);
  239. mreq.imr_multiaddr.S_un.S_addr = inet_addr(IP_MULTICAST);
  240. if(SOCKET_ERROR == setsockopt(*pServerSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP,/
  241. &mreq, sizeof(mreq)))
  242. {
  243. closesocket(*pServerSocket);
  244. WSACleanup();
  245. return WSAGetLastError();
  246. }
  247. return 0;
  248. }
  249. int SetSocketOption(SOCKET *pSocket, int nLevel,/
  250. int nOptname, const char FAR *pOptval, int nOptlen)
  251. {
  252. if(SOCKET_ERROR == setsockopt(*pSocket, nLevel, /
  253. nOptname, pOptval, nOptlen))
  254. {
  255. return WSAGetLastError();
  256. }
  257. return 0;
  258. }
  259. int ReciveFrom(SOCKET *pSocket, char pBuff[], int nOffset, int nLen)
  260. {
  261. struct sockaddr_in ClientAddr;
  262. int nReturn = 0, nAddrLen;
  263. memset(&ClientAddr, 0, sizeof(struct sockaddr_in));
  264. nAddrLen = sizeof(ClientAddr);
  265. nReturn = recvfrom(*pSocket, pBuff, nLen, /
  266. 0, (struct sockaddr *)&ClientAddr, &nAddrLen);
  267. #if 0
  268. memcpy(pBuff, "wenxy", sizeof("wenxy"));
  269. nReturn = 5;
  270. #endif
  271. if(nReturn == SOCKET_ERROR)
  272. {
  273. return -1;
  274. }
  275. return 0;
  276. }
  277. int SendTo(SOCKET *pServerSocket, char *pBuff, int nOffset, int nLen)
  278. {
  279. int nSendLen;
  280. struct sockaddr_in remote;
  281. memset(&remote, 0, sizeof(remote));
  282. remote.sin_addr.s_addr = inet_addr ( IP_MULTICAST );
  283. remote.sin_family = AF_INET;
  284. remote.sin_port = htons(PORT_UDP_SERVER);
  285. nSendLen = sendto(*pServerSocket, pBuff, nLen, 0, /
  286. (struct sockaddr *)&remote, sizeof(remote));
  287. if(nSendLen <= 0)
  288. {
  289. return WSAGetLastError();
  290. }
  291. return 0;
  292. }
  293. /************************************************************************/
  294. /* client functions */
  295. int CreatClientUDPSocket(SOCKET *pClientSocket, char chClientIP[], /
  296. unsigned short uPort)
  297. {
  298. unsigned long ulOptval;
  299. unsigned short uVersionRequested;
  300. WSADATA wsaData;
  301. struct ip_mreq mreq;
  302. const int nOn = 1;
  303. uVersionRequested = MAKEWORD(2, 2);
  304. if(0 != WSAStartup(uVersionRequested, &wsaData))
  305. {
  306. return WSAGetLastError();
  307. }
  308. *pClientSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
  309. if(INVALID_SOCKET == *pClientSocket)
  310. {
  311. closesocket(*pClientSocket);
  312. WSACleanup();
  313. return WSAGetLastError();
  314. }
  315. #if 0
  316. /* set socket option */
  317. if(SOCKET_ERROR == setsockopt(*pClientSocket, SOL_SOCKET, /
  318. SO_REUSEADDR, (char *)&nOn, sizeof(nOn)))
  319. {
  320. closesocket(*pClientSocket);
  321. WSACleanup();
  322. return WSAGetLastError();
  323. }
  324. #endif
  325. #if 1
  326. /* bind */
  327. memset(&gClientAddr, 0, sizeof(gClientAddr));
  328. gClientAddr.sin_family = AF_INET;
  329. gClientAddr.sin_addr.s_addr = inet_addr(chClientIP);
  330. gClientAddr.sin_port = htons( uPort );
  331. if(SOCKET_ERROR == bind(*pClientSocket, &gClientAddr, sizeof(gClientAddr)))
  332. {
  333. closesocket(*pClientSocket);
  334. WSACleanup();
  335. return WSAGetLastError();
  336. }
  337. #endif
  338. /* join a group of multicast */
  339. memset(&mreq, 0, sizeof(mreq));
  340. mreq.imr_interface.S_un.S_addr = inet_addr(chClientIP);
  341. mreq.imr_multiaddr.S_un.S_addr = inet_addr(IP_MULTICAST);
  342. if(SOCKET_ERROR == setsockopt(*pClientSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP,/
  343. &mreq, sizeof(mreq)))
  344. {
  345. closesocket(*pClientSocket);
  346. WSACleanup();
  347. return WSAGetLastError();
  348. }
  349. return 0;
  350. }

c网络编程-多播的更多相关文章

  1. Linux网络编程--多播

    一.多播介绍 什么是多播? 单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信.单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信.实际情 ...

  2. linux网络编程之一-----多播(组播)编程

    什么是多播 组播(Multicast)是网络一种点对多(one to many)的通信方式,通过报文复制完成网络中一台server对应多台接收者的高效数据传 送.对其形象的比喻就是类似于广播电台和电视 ...

  3. c++ 网络编程(六)LINUX下 socket编程 多播与广播 实现一次发送所有组客户端都能接收到

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614288.html 一.多播 锲子:有这么一种情况,网络电台可能需要同时向成千上万的用户传输 ...

  4. TCP/IP网络编程之多播与广播

    多播 多播方式的数据传输是基于UDP完成的,因此,与UDP服务端/客户端的实现非常接近.区别在于,UDP数据传输以单一目标进行,而多播数据同时传递到加入(注册)特定组的大量主机.换言之,采用多播方式时 ...

  5. Linux IO模型和网络编程模型

    术语概念描述: IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者. 阻塞和非阻塞,是函数/方法的实现方式,即在数据就绪之前是立刻返回还是等待. 以文件IO为例,一个IO读过程是文件 ...

  6. UNIX网络编程-基本API介绍(二)

    参考链接:http://www.cnblogs.com/riky/archive/2006/11/24/570713.aspx 1.getsockname和getpeername getsocknam ...

  7. Unix网络编程--卷一:套接字联网API

    UNIX网络编程--卷一:套接字联网API 本书面对的读者是那些希望自己编写的程序能够使用成为套接字(socket)的API进行彼此通信的人. 目录: 0.准备环境 1.简介 2.传输层:TCP.UD ...

  8. Android网络编程系列 一 TCP/IP协议族

    在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...

  9. 【Java基础】Java网络编程基础知识

    什么是网络编程 网络编程是通过使用套接字来达到进程间通信目的,那什么是套接字呢?其实套接字是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的 ...

随机推荐

  1. docker 概念初识

    1 docker 优势,一次创建或配置可以在任意时间.任意环境让应用正常的运行. 快速交付和部署,开发人员可以使用镜像快速构建一套标准的开发环境:开发完后测试和运维人员可以直接使用相同的环境来部署代码 ...

  2. 利用PHPExcel实现数据保存到excel文件

    include(dirname(__FILE__) .'/phpexcel-1.7.7/Classes/PHPExcel.php'); include(dirname(__FILE__) .'/php ...

  3. java多线程实验 滚动字

    package com.rgy.Test; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt ...

  4. jquery+ashx checkbox 单选判断是否true 和 false 传值操作

    示例图: html标签代码: <p></p> <label for="checkbox" style="float:left" & ...

  5. C++ Dll 编写入门

    一.前言 自从微软推出16位的Windows操作系统起,此后每种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上 Windows操作系统中几乎所有的内容都由DLL以一 ...

  6. Oracle PLSQL Demo - 16.弱类型REF游标[没有指定查询类型,已指定返回类型]

    declare Type ref_cur_variable IS REF cursor; cur_variable ref_cur_variable; rec_emp scott.emp%RowTyp ...

  7. git使用教程&&问题列表

    git教程[转] http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 git push ...

  8. c++之——虚析构函数

    先看代码: #include<iostream> using namespace std; class Parent { public: Parent() :a(), b(), c() { ...

  9. VC中使用Matlab Engine出现"无法找到libeng.dll"的问题

    VC中使用Matlab Engine出现"无法找到libeng.dll"的问题 本以为使这个原因 ,其实不是我2了 #include "engine.h" // ...

  10. 一款基于jquery和css3实现的摩天轮式分享按钮

    之前分享了很多css3实现的按钮.今天要给大家带来一款基于jquery和css3实现的摩天轮式分享按钮.这款分享按钮页面底部有一个toggle按钮,单击该按钮,摩天轮按钮以动画的形式出现,各个分享按钮 ...