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. Excel导入的时候日期格式会变成double式的String数据处理

    例如:java从Excel单元格读取的日期如43052.0,在后台处理的时候又需要将其处理为日期格式,使用如下代码对其进行转换即可: SimpleDateFormat sdf = new Simple ...

  2. unity5, Configurable Joint: Anchor, Connected Anchor, Auto Configure Connected Anchor

    configurable joint加在轮子上,connected body是车身. 这种情况下,Anchor=(0,0,0)表示轮子一端joint锚点取carWheelCenter Connecte ...

  3. TRIZ系列-创新原理-9~11-预先反作用原理、预处理原理、预先防范原理

    一.预先反作用原理表述例如以下: 1)预先给物体施加反作用,以补偿过量的或者不想要的压力. 假设知道系统在执行过程中,会有不利的或者有害的作用(负面作用)产生,则能够预先採取一定的措施来抵消.控制这样 ...

  4. Statistical Concepts and Market Returns

    Statistical Concepts and Market Returns Categories of statistics Descriptive statistics: used to sum ...

  5. U3D-LookAt插值动画

    var qua = Quaternion.FromToRotation(Vector3.forward, target.transform.position - transform.position) ...

  6. VS2015预览版体验

    .NET开源了,JAVA颤抖吧... 据说VS2015可以开发android,ios,wp应用程序了,还可以开发能运行在mac,linux上的ASP.NET网站,如果真是这样就太爽啦,上微软官网下载了 ...

  7. 【Android】8.1 主题基本用法

    分类:C#.Android.VS2015: 创建日期:2016-02-17 一.创建本章示例主界面 1.界面截图 2.MainActivity.cs文件中对应的代码 在CreateChItems()方 ...

  8. 在java代码中用xslt处理xml文件

    java处理xml文件 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExceptio ...

  9. tomcat java变量环境设置

    绿色版tomcat 手动启动startup.bat的时候出现一闪而过的状态.解决方法,配置startup.bat文件 @echo off SET JAVA_HOME=C:\Program Files ...

  10. Jar包版本查看方法

    原文:  https://blog.csdn.net/u011287511/article/details/66973559 打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目 ...