Linux网络编程一步一步学-UDP组播

组播客户端代码如下:
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <arpa/inet.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #define BUFLEN 255
  8. /*********************************************************************
  9. *filename: mcastclient.c
  10. *purpose: 演示组播编程的基本步骤,其实这就是一个基本的UDP客户端程序
  11. *tidied by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)
  12. Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
  13. *date time:2007-01-25 13:10:00
  14. *Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
  15. * 但请遵循GPL
  16. *Thanks to: Google.com
  17. *Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
  18. * 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
  19. *********************************************************************/
  20. int main(int argc, char **argv)
  21. {
  22. struct sockaddr_in peeraddr, myaddr;
  23. int sockfd;
  24. char recmsg[BUFLEN + 1];
  25. unsigned int socklen;
  26. /* 创建 socket 用于UDP通讯 */
  27. sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  28. if (sockfd < 0) {
  29. printf("socket creating error/n");
  30. exit(1);
  31. }
  32. socklen = sizeof(struct sockaddr_in);
  33. /* 设置对方的端口和IP信息 */
  34. memset(&peeraddr, 0, socklen);
  35. peeraddr.sin_family = AF_INET;
  36. if (argv[2])
  37. peeraddr.sin_port = htons(atoi(argv[2]));
  38. else
  39. peeraddr.sin_port = htons(7838);
  40. if (argv[1]) {
  41. /* 注意这里设置的对方地址是指组播地址,而不是对方的实际IP地址 */
  42. if (inet_pton(AF_INET, argv[1], &peeraddr.sin_addr) <= 0) {
  43. printf("wrong group address!/n");
  44. exit(0);
  45. }
  46. else {
  47. printf("no group address!/n");
  48. exit(0);
  49. }
  50. /* 设置自己的端口和IP信息 */
  51. memset(&myaddr, 0, socklen);
  52. myaddr.sin_family = AF_INET;
  53. if (argv[4])
  54. myaddr.sin_port = htons(atoi(argv[4]));
  55. else
  56. myaddr.sin_port = htons(23456);
  57. if (argv[3]) {
  58. if (inet_pton(AF_INET, argv[3], &myaddr.sin_addr) <= 0) {
  59. printf("self ip address error!/n");
  60. exit(0);
  61. }
  62. else
  63. myaddr.sin_addr.s_addr = INADDR_ANY;
  64. /* 绑定自己的端口和IP信息到socket上 */
  65. if (bind
  66. (sockfd, (struct sockaddr *) &myaddr,
  67. sizeof(struct sockaddr_in)) == -1) {
  68. printf("Bind error/n");
  69. exit(0);
  70. }
  71. /* 循环接受用户输入的消息发送组播消息 */
  72. for (;;) {
  73. /* 接受用户输入 */
  74. bzero(recmsg, BUFLEN + 1);
  75. if (fgets(recmsg, BUFLEN, stdin) == (char *) EOF)
  76. exit(0);
  77. /* 发送消息 */
  78. if (sendto
  79. (sockfd, recmsg, strlen(recmsg), 0,
  80. (struct sockaddr *) &peeraddr,
  81. sizeof(struct sockaddr_in)) < 0) {
  82. printf("sendto error!/n");
  83. exit(3);
  84. }
  85. printf("'%s' send ok/n", recmsg);
  86. }
  87. }

 

组播服务器端程序源代码为:

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <arpa/inet.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <netdb.h>
  8. #include <errno.h>
  9. #define BUFLEN 255
  10. /*********************************************************************
  11. *filename: mcastserver.c
  12. *purpose: 演示组播编程的基本步骤,组播服务器端,关键在于加入组
  13. *tidied by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)
  14. Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
  15. *date time:2007-01-25 13:20:00
  16. *Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
  17. * 但请遵循GPL
  18. *Thanks to: Google.com
  19. *Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
  20. * 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
  21. *********************************************************************/
  22. int main(int argc, char **argv)
  23. {
  24. struct sockaddr_in peeraddr;
  25. struct in_addr ia;
  26. int sockfd;
  27. char recmsg[BUFLEN + 1];
  28. unsigned int socklen, n;
  29. struct hostent *group;
  30. struct ip_mreq mreq;
  31. /* 创建 socket 用于UDP通讯 */
  32. sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  33. if (sockfd < 0) {
  34. printf("socket creating err in udptalk/n");
  35. exit(1);
  36. }
  37. /* 设置要加入组播的地址 */
  38. bzero(&mreq, sizeof(struct ip_mreq));
  39. if (argv[1]) {
  40. if ((group = gethostbyname(argv[1])) == (struct hostent *) 0) {
  41. perror("gethostbyname");
  42. exit(errno);
  43. }
  44. else {
  45. printf
  46. ("you should give me a group address, 224.0.0.0-239.255.255.255/n");
  47. exit(errno);
  48. }
  49. bcopy((void *) group->h_addr, (void *) &ia, group->h_length);
  50. /* 设置组地址 */
  51. bcopy(&ia, &mreq.imr_multiaddr.s_addr, sizeof(struct in_addr));
  52. /* 设置发送组播消息的源主机的地址信息 */
  53. mreq.imr_interface.s_addr = htonl(INADDR_ANY);
  54. /* 把本机加入组播地址,即本机网卡作为组播成员,只有加入组才能收到组播消息 */
  55. if (setsockopt
  56. (sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,
  57. sizeof(struct ip_mreq)) == -1) {
  58. perror("setsockopt");
  59. exit(-1);
  60. }
  61. socklen = sizeof(struct sockaddr_in);
  62. memset(&peeraddr, 0, socklen);
  63. peeraddr.sin_family = AF_INET;
  64. if (argv[2])
  65. peeraddr.sin_port = htons(atoi(argv[2]));
  66. else
  67. peeraddr.sin_port = htons(7838);
  68. if (argv[1]) {
  69. if (inet_pton(AF_INET, argv[1], &peeraddr.sin_addr) <= 0) {
  70. printf("Wrong dest IP address!/n");
  71. exit(0);
  72. }
  73. else {
  74. printf("no group address given, 224.0.0.0-239.255.255.255/n");
  75. exit(errno);
  76. }
  77. /* 绑定自己的端口和IP信息到socket上 */
  78. if (bind
  79. (sockfd, (struct sockaddr *) &peeraddr,
  80. sizeof(struct sockaddr_in)) == -1) {
  81. printf("Bind error/n");
  82. exit(0);
  83. }
  84. /* 循环接收网络上来的组播消息 */
  85. for (;;) {
  86. bzero(recmsg, BUFLEN + 1);
  87. n = recvfrom(sockfd, recmsg, BUFLEN, 0,
  88. (struct sockaddr *) &peeraddr, &socklen);
  89. if (n < 0) {
  90. printf("recvfrom err in udptalk!/n");
  91. exit(4);
  92. else {
  93. /* 成功接收到数据报 */
  94. recmsg[n] = 0;
  95. printf("peer:%s", recmsg);
  96. }
  97. }
  98. }

 

编译程序用下列命令:
gcc -Wall mcastclient.c -o mcastclient
gcc -Wall mcastserver.c -o mcastserver
运行程序用如下命令:
./mcastserver 230.1.1.1 7838
客户端程序运行命令为:
./mcastclient 230.1.1.1 7838 192.168.100.1 12345

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值