简单写一个加入组播组接收到数据的代码

 

#include <stdio.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#pragma  comment (lib, "ws2_32.lib")
DWORD WINAPI ThreadProc1 (PVOID pParam) 
{
 SOCKET *socketFd = (SOCKET *)pParam;

 if (socketFd ==NULL)
 {
  printf("ThreadProc1 : sockedFd null\n");

 }
 printf("in thread \n");
 sockaddr_in remoteAddr;
 int nAddrLen = sizeof(remoteAddr); 
 while (1)
 {
  char recvData[255];  
  int ret = recvfrom(*socketFd, recvData, 255, 0, (sockaddr *)&remoteAddr, &nAddrLen);
  if (ret > 0)
  {
   recvData[ret] = 0x00;
   printf("收到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
   for (int i =0; i < ret; i++)
   {
    printf("%02x",recvData[i]&0xff);
    if ((i+1)%4 ==0)
    {
     printf(" ");
    }
    if ((i+1)%16 == 0)
    {
     printf("\n");

    }
   }
   printf("\n");
  }
   
  }

}
int main(int argc, char *argv[])
{

 SOCKET serSocket;
 WSADATA wsaData;
 WORD sockVersion = MAKEWORD(2,2);
 int  optval;

 optval=1;
 if(WSAStartup(sockVersion, &wsaData) != 0)
 {
      return 0;
 }
 serSocket = socket(AF_INET, SOCK_DGRAM,IPPROTO_IP);


 if (serSocket == INVALID_SOCKET)
 {
  printf("socket error !!\n");
  return -1;
 }

 if(setsockopt(serSocket, SOL_SOCKET, SO_REUSEADDR, (char *)&optval, sizeof(optval)) < 0)  //将SOKCET地址置为可重用
 {
  printf("setsockopt 1 error !!\n");

  return -1;
 }


 sockaddr_in serAddr;
 serAddr.sin_family = AF_INET;
 serAddr.sin_port = htons(5100);
 serAddr.sin_addr.S_un.S_addr = INADDR_ANY;
 if(bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
 {
  printf("bind error !\n");
  closesocket(serSocket);
  return -1;
 }


 struct ip_mreq  ipmr;
 ipmr.imr_interface.s_addr = htonl(INADDR_ANY);
 ipmr.imr_multiaddr.s_addr = inet_addr("10.8.59.186");
 int flag;

 if (setsockopt(serSocket, IPPROTO_IP, IP_MULTICAST_IF, (char*)&ipmr, sizeof(ipmr))<0)
 {
  printf("setsockopt 2 error !!\n");
  return -1;
 }


 flag = 64;
 if(setsockopt(serSocket, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&flag, sizeof(flag))!=0)
 {
  printf("setsockopt 3 error !!\n");
  return -1;
 }
 

 flag =0;

 
 if (setsockopt(serSocket, IPPROTO_IP, IP_MULTICAST_LOOP,(char *)&flag, sizeof(flag)) == SOCKET_ERROR)
 {
  closesocket(serSocket);
  printf("setsockopt 4error !!\n");
  return -1;
 }
 

 HANDLE handle1=CreateThread(NULL,0,ThreadProc1,( LPVOID )&serSocket,0,NULL); 

 
 printf("is ready, please enter the multiAddress \n");

 char multiAddress[64];
 scanf("%s", multiAddress);

 
 // 将ip地址加入组播组。


 struct ip_mreq  ipMreq;
 ipMreq.imr_interface.s_addr = htonl(INADDR_ANY);
 ipMreq.imr_multiaddr.s_addr = inet_addr(multiAddress);


 if (setsockopt(serSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&ipMreq, sizeof(ipMreq)) < 0)
 {

  closesocket(serSocket);
  printf("setsockopt 5error !!\n");

  return -1;
 }


 while (1)
 {
  Sleep(1000);
 }
 closesocket(serSocket);
 CloseHandle(handle1);
 return 0;
}


 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 答:网络组播接收程序的功能是从网络中接收组播数据报,并将其转发给本地主机的进程。它可以通过网络协议栈(如TCP / IP)实现,或者可以使用特定的网络应用程序,如UDP或RTP。它的工作原理是,当一台机器发送组播数据报时,其他机器可以接收这些数据报并将其转发给本地主机的进程。 ### 回答2: 网络组播接收程序是指在网络中接收多播数据包的程序。多播是一种一对多的通信方式,即发送者可以同时向多个接收者发送相同的数据包。 编一个网络组播接收程序的步骤如下: 1. 创建一个套接字(socket),指定使用的协议和端口号。多播使用的协议一般是UDP协议,端口号可以任意选择。 2. 设置套接字为组播模式,即允许接收组播数据包。可以使用socket的setsockopt函数来进行设置。 3. 绑定套接字到一个本地地址。可以使用socket的bind函数将套接字与一个本地IP地址绑定。这个IP地址是接收数据包的网络接口的IP地址。 4. 加入组播组。使用socket的setsockopt函数,设置IP_MULTICAST_ADD选项来加入一个组播组,指定组播组的IP地址。 5. 进行接收数据包的循环。使用socket的recvfrom函数,接收组播数据包,并将数据包内容输出显示。 6. 关闭套接字,释放资源。 一个简单的网络组播接收程序的示例代码如下: ```python import socket # 创建套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 设置组播模式 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) # 绑定本地地址 sock.bind(('本地IP地址', 端口号)) # 加入组播组 mreq = socket.inet_aton('组播组IP地址') + socket.inet_aton('本地IP地址') sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) # 接收数据包 while True: data, addr = sock.recvfrom(1024) print('Received:', data.decode(), 'from:', addr) # 关闭套接字 sock.close() ``` 以上是一个简单的网络组播接收程序的实现,可以接收从组播组发送过来的数据包,并将数据包内容输出显示。根据实际需求,可以通过修改代码中的IP地址、端口号等参数来适应不同的组播场景。 ### 回答3: 网络组播接收程序是一种可以接收和处理组播数据包的程序。组播是一种广播方式,能够将一个数据包同时发送给多个目标地址。 要编一个网络组播接收程序,首先需要创建一个套接字,并指定组播地址和端口号。套接字可以通过调用系统函数创建,使用IPv4或IPv6协议。 接下来,需要使用设置适当的套接字选项,以便能够接收来自组播地址的数据包。这可以通过调用setsockopt函数并将套接字选项设置为IP_ADD_MEMBERSHIP来实现。 接收程序需要在一个无限循环中运行,以便持续接收组播数据包。在每次循环中,程序应该使用recvfrom函数从套接字中接收数据包,并将其存储在一个缓冲区中。 接收到数据包可以根据需要进行处理。可以将数据包打印出来,存储到文件中,或者进行其他任何操作。处理方式取决于具体的应用场景和需求。 最后,当接收程序不再需要接收组播数据包时,应该关闭套接字,并释放相关资源。这可以通过调用close函数来实现。 总结来说,网络组播接收程序是一个能够接收和处理组播数据包的程序。通过创建套接字、设置套接字选项、循环接收数据包并进行处理,可以实现一个简单的网络组播接收程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值